Project/javachip

[2nd Project] 여행 일정 마이페이지에 불러오기 (JSP, STS, Mysql)

ParkYeseul 2024. 10. 23. 17:42

여행일정 마이페이지에 불러오기
핫플, 저장목록, 게시글을 불러오고 마지막.. 여행일정 불러오기

오늘은 오류 타파의 날!

  <!-- 다가오는 여행 일정 조회 -->
    <select id="getUpcomingTrips" parameterType="int" resultType="com.human.web.vo.MypageVO">
        SELECT
            ts.period_start,
            ts.period_end,
            ts.title AS t_title,
            ts.city_name,
            ts.place_name,
            ts.place_address
        FROM
            M_Mypage mm
        JOIN
            travel_schedule ts ON mm.m_idx = ts.m_idx
        WHERE
            mm.m_idx = #{m_idx}
            AND ts.period_end >= CURDATE()
        ORDER BY
            ts.period_start ASC;
    </select>

    <!-- 지난 여행 일정 조회 -->
    <select id="getPastTrips" parameterType="int" resultType="com.human.web.vo.MypageVO">
        SELECT
            ts.period_start,
            ts.period_end,
            ts.title AS t_title,
            ts.city_name,
            ts.place_name,
            ts.place_address
        FROM
            M_Mypage mm
        JOIN
            travel_schedule ts ON mm.m_idx = ts.m_idx
        WHERE
            mm.m_idx = #{m_idx}
            AND ts.period_end IS NOT NULL
            AND DATE(ts.period_end) < CURDATE()
        ORDER BY
            ts.period_start ASC;
    </select>

이렇게 썼을 때 

오류1.

AND DATE(ts.period_end) < CURDATE() 요 구문에서 자꾸 오류가 났다. 
[The content of elements must consist of well-formed character data or markup.]


gpt가 해보라는대로 해봤지만 그래도 오류가 나서 구글링을 했는데 
<![CDATA[]]> 이러한 태그로 하면 해결이 된다는.. .

GPT 말씀
<![CDATA[]]>는 XML 내에서 특수 문자나 태그를 포함한 텍스트를 사용할 때 유용
CDATA 섹션을 사용하면 <, >, &와 같은 특수 문자를 포함한 SQL 쿼리나 태그를

엔티티로 변환하지 않고 그대로 사용할 수 있다.

XML 파일에서 <, >, &와 같은 특수 문자를 직접 사용하는 경우 

XML 파싱 오류가 발생할 수 있기 때문에, CDATA 섹션을 사용하여 이러한 오류를 방지할 수 있다.

 

그렇게 했더니 이제 Mapper의 오류는 해결했다. 
오류1 해결.


오류2. MypageVO의 모든 객체들을 null값으로 받아와서 출력이 안된다.

 

그래서 강제 매핑을 하려고 resultmap을 사용해서 해봤으나 되지 않았고, VO를 분리시키는 방법으로 해결했다.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MypageSchedVO {
	 	private Date period_start;    // 여행 시작 날짜
	    private Date period_end;      // 여행 끝 날짜
	    private String t_title;       // 여행기 제목
	    private String city_name;     // 도시 이름
	    private String place_name;    // 여행 장소
	    private String place_address; // 여행 장소 주소
	    private int m_idx;  
}

 

VO를 분리시키니 값은 잘 가지고 왔으나 또 열리지 않는 404..

컨트롤러를 들여다보고 있는데 글쎄 return값에 폴더명 오류가 있었다. 

하나하나 타이핑 하다보니 생기는 휴먼에러 🥐

 

이정도야 애교로 봐줄 수 있자나..

오늘은 데이터가 많다보니 배열을 사용해서 불러왔다. (영신어드바이스)

 

🍭MypageController

//여행 일정 불러오기
	@RequestMapping("/m_myTrips")
	public String getMyTrips(HttpSession session, Model model) {
		//세션에서 M_MemberVO 객체 가져오기
		M_MemberVO member = (M_MemberVO)session.getAttribute("member");//로그인할 때 저장된 vo
		
		//세션에 member 정보가 없는 경우(로그인 되지 않은 상태)
		if(member == null) {
			System.out.println("세션에서 회원정보를 찾을 수 없습니다.");
			return "redirect:/Member/login";//로그인 페이지로 리다이렉트
		}else {
		    System.out.println("로그인된 회원 정보: " + member);
		}
		
		//로그인된 사용자의 m_idx값 가져오기
		int m_idx = member.getM_idx();
		System.out.println("로그인 된 사용자 m_idx: " +m_idx);
		
		//tripSchedService에서 다가오는 일정과 지난 일정 가져오기(조인된 데이터를 사용)
		List<MypageSchedVO> upcomingTripsList = mypageService.getUpcomingTrips(m_idx);
		System.out.println("다가오는 일정: " + upcomingTripsList);
		List<MypageSchedVO> pastTripsList = mypageService.getPastTrips(m_idx);
		System.out.println("지난 일정: " + pastTripsList);
		
		// 리스트를 배열로 변환
	    MypageSchedVO[] upcomingTrips = upcomingTripsList.toArray(new MypageSchedVO[upcomingTripsList.size()]);
	    MypageSchedVO[] pastTrips = pastTripsList.toArray(new MypageSchedVO[pastTripsList.size()]);

	    // 배열로 출력된 데이터를 확인하기 위한 로그 출력
	    System.out.println("다가오는 일정 (배열): " + Arrays.toString(upcomingTrips));
	    System.out.println("지난 일정 (배열): " + Arrays.toString(pastTrips));

	    // model에 다가오는 일정과 지난 일정을 추가하여 jsp에 전달
	    model.addAttribute("upcomingTrips", upcomingTrips);
	    model.addAttribute("pastTrips", pastTrips);
	    System.out.println("Model에 전달된 다가오는 일정: " + Arrays.toString(upcomingTrips));
	    System.out.println("Model에 전달된 지난 일정: " + Arrays.toString(pastTrips));

		//mypage 폴더 내의 m_myTrips로 이동하여 일정 데이터를 클라이언트에게 보여줌
		return "MyPage/m_myTrips";
		
	}

 

toArray()

List 인터페이스에서 제공하는 메서드로, 리스트의 모든 요소를 배열로 변환

이 메서드는 매개변수로 전달된 배열의 타입과 크기에 맞춰 리스트의 내용을 복사해서 새로운 배열을 생성.

매개변수로 넘기는 배열은 리스트의 크기만큼 생성하여 넘겨줌
여기서 new MypageSchedVO [upcomingTripsList.size()]는 리스트 크기만큼의 배열을 생성

upcomingTripsList.size()는 리스트의 크기(요소의 개수)를 반환 따라서,

리스트의 크기만큼의 배열을 만들어 toArray() 메서드에 넘기면, 해당 배열에 리스트의 요소들이 복사된다

 

 

upcomingTripsList와 pastTripsList는 리스트이고,
toArray()를 사용하여 해당 리스트들을 배열로 변환했다.

데이터를 좀 더 묶으려고 배열로 변환한건데! 이거 덕분에 된건지 아리까리 하지만 동시에 된 건 맞으니까 헤헷

오늘 깃에 합치기까지 했으니 진짜 CSS만!!!!!!!!!!!!!!(ㅇ우욱..하기싫어..)

 

미래에 살면 불안하니까 현재에 살자!