😵 ~23.11.10/✨ Prj.BuildDiary

[BE] 데이터 조인하기 1차 (Feed) & 오류 정리

unikue 2023. 9. 26. 20:44

✅ 피드 데이터 조인하기

 
데이터 조인하는 수업을 듣고 내 화면 데이터 조인을 해봐야겠다고 생각했는데... 피드는 온갖 데이터가 한곳에 모이기 때문에 여기저기 흩어져 있어서 (회원정보 + 미션정보 + 미션 후기 정보가 한번에 모인다) 약간 멘붕이 왔었다.
 
팀원들이랑 얘기해보면서 그나마 가닥이 좀 잡혀서 나중에 디테일 화면때 또 조인해야 하니까 ㅎㅎ 접근방법을 기록해 둠.
 
 

#️⃣  주인공 파악하고 곁다리 붙이기

선생님께서 말씀하신대로 주인공+곁다리 데이터를 붙이려고 하면서 보니, 얘가 이름은 피드지만 데이터상에서 주인공은 미션로그였다. 미션을 수행한 후기(==미션로그) 가 피드를 통해 뷰로 보여지기 때문.
 
그래서 미션로그에 무슨 살을 붙여야하나 생각하던중에, 미션로그+미션을 붙이면 일단 미션관련 데이터는 모두 모인다는 팁을 듣고서 일단 조인문을 써봤다.

// 미션로그에 미션 붙이기
select * 
from mission_log ml 
join mission m on ml.mission_id=m.id

 
이 상태로 필요한 속성값을 뽑으려고 보니, 아이디와 프로필사진은 모두 회원정보 테이블에서 오는거라... 조인문을 하나 더 붙였다. 

// 미션에 회원정보 붙이기
select *
from mission m join member mb
on m.member_id = mb.user_id;

 
미션로그는 미션아이디를 가지고있고, 미션은 회원아이디를 가지고있어서 이렇게 쓰고 보니... 그냥 inner join 으로 교집합 데이터만 다 모으면 되는거 아닌가 싶었다.(피드는 작성데이터만 노출되기 때문에 아우터를 쓸 필요도 없고 널값이 들어갈 일이 없다)
그래서 일단 전체 데이터를 뽑아봄.
 

//미션로그에 미션과 멤버 붙이기
select * 
from mission_log ml 
join mission m on ml.mission_id=m.id
join member mb on ml.member_id=mb.id;

 
이렇게 되면 속성을 다 끌고왔기때문에 가로로 어마어마하게 늘어나므로 내가 필요한 데이터를 뽑아야 함.
 
 

#️⃣  필요한 속성 파악하기

작성자 아이디가 아니고 닉네임이 맞음

 
피드에 필요한 속성을 정리해놓고 하나씩 alias 확인하며 끌어왔다. 일단 후기사진까지만 view를 만들고, 좋아요 댓글 북마크는 view에 추가로 조인하려 한다........... 

create view mission_log_view 
as
select
m.id mission_id,
ml.id m_log_id,
mb.nickname,
mb.img writer_pic,
ml.reg_date m_log_date,
m.personality_id p_id,
m.activity_id a_id,
m.title m_title,
ml.contents m_log_contents,
ml.img m_log_pic
from mission_log ml 
join mission m on ml.mission_id=m.id
join member mb on ml.member_id=mb.id;

미션 1번에 대해서 후기가 14개 달린것 (작성자는 모두 회원2임)

일단은 테이블이 깔끔하게 정돈됐음! 
 
좋아요 처리하는법 수업 끝난 다음에 나머지 세개는 한번에 처리할 예정.
이거 잘 되면 피드 디테일 화면도 좀....잘 되지않을까......기대해본다......

 

 


 

✅ DB연결해서 데이터 콘솔에 띄우기

 #️⃣DB연결

이클립스로 프로젝트용 MVC를 조금 만들어둔것 + 수업시간에 기본 설정값을 해둔게 있어서 수월하게 진행할 줄 알았으나, 역시 에러가 남!

 

[error] no mybatis mapper was found in '[kr.co.octap.test]' package. please check your configuration.

 

mapper를 왜 못찾나 싶어서 돌고돌고 돌았는데, 무려 세개나 문제가 있었음.

 

  • @Autowired같은건 다 붙여놓고 @Mapper, @Controller 어노테이션을 빼먹음 (너무나 기초적)
  • application.properties에서 mybatis.mapper-locations=mappers/*Mapper.xml 로 mapper가 들어간 이름을 검색하게 해놓고 FeedRepository.xml로 만들어놓음
  • FeedReposiotory로 오타냄.........

 

이렇게 하니 일단 서버 구동은 완료! 

그러나 데이터를 띄우는데서 또 오류가 뜨고 마는데.

 

 

 

 

 #️⃣데이터 콘솔에 띄우기

 

위에서 만든 뷰를 불러오기위해서 entity와 MVC를 모두 만들어서 연결했는데 아래처럼 mountain.jpg를 Long타입으로 변환 불가하단 오류메세지가 떴다. db에도 String이고 Entity에도 String으로 해놓았는데 왜 변환에서 문제가 생겼다는건지 이해를 할수가 없었음 와이 🤷‍♀️??????

 

 

 

1) 일단 문제 데이터가있는 Member 테이블이 데이터를 불러올시에 문제가 생기나 싶어서, Member Entity를 읽어오는 MVC를 급하게 만들어서 콘솔에 띄워봤다. 그랬더니 멤버 자체의 데이터는 문제가 없었음! 그렇다면 새로 만든 View 관련 문제라는 건데.

 

 

2) 그래서 돌고 돌다가 long으로 선언되어있던 바로 위의 writerId를 int로 바꿔봤더니 아래와같이 Integer로 변환할 수 없다고 오류메세지가 바꼈다!

 

 

 

3) 그제서야 이건 View의 Entity문제가 확실하다 싶어서 DB 속성과 비교해봤는데, 최종 데이터에 필요한 Feed Id를 내가 미리 선언해둬서 롬복이 데이터를 하나씩 밀어서 읽게됨..........한마디로 뷰에있는 db속성개수와 entity에 선언해둔 속성 개수가 불일치했던 것.

 

@Data
@AllArgsConstructor
public class FeedView {
//	피드데이터
	
//피드아이디 주석처리중
//	private long id;

    private long missionLogId;
    private long missionId;

    private long writerId;
    private String writerPic;
    private Date missionLogDate;
    private int personalityId;
    private int activityId;
    private String missionTitle;
    private String logContents;
    private String logPic;
				
//뷰 추가 속성
//		private int likeCount;
//		private int commentCount;
}

 

드디어 콘솔로 데이터를 끌어왔고... 타임리프 적용해서 뷰에 붙여보면 1차 연습은 완료할 수 있을것 같다.