[TIL]20220810

god1hyuk·2022년 8월 9일
1

TIL / WIL

목록 보기
15/30

1. Spring Boot 미션 : 좋아요 기능 완료

2. Spring Boot 미션 : 게시물, 댓글, 대댓글 수정/삭제 이슈 해결

3. Spring Boot 미션 : 마이페이지 내가 작성한 게시물, 댓글, 대댓글 응답 처리 완료


금일 기술 매니저님 순회와 야자 스터디 이외 시간에는 따로 강의를 보거나 따로 공부하지 않고 항해99 5주차 팀미션에 몰두했다.

며칠전까지 JPA 연관관계 매핑에 대해 감이 오지 않았던 나인데, 어느덧 자연스레 습득이 되었고 프로젝트에 불이 붙었다. 아직 JPA에 대해 배울 부분이 산더미이지만 이제 점차 흐름이 보인다. (또 다른 프로젝트 환경에서는 아닐지도)

1. Spring Boot 미션 : 좋아요 기능 완료

게시물, 댓글 및 대댓글, 좋아요 기능은 같은 맥락이다. CRUD부터 JPA 연관관계 매핑까지 사실 내 머리로만 해냈다고 하기엔 참고한 부분이 너무 많다. 그래도 모범답안 예시를 참고하여 이래저래 붙여보며 적용하다보니 이해가 되었고 흐름이 읽혔다.

"좋아요" 기능은 "Like" Entity를 따로 생성 후 Member(사용자), Post(게시물), Comment(댓글), SubComment(대댓글) 별로 각각 참조하여 FK(Foreign key, 참조 키)를 갖게 된다.

Like.java

// 대표적으로 Post만 명시 (나머지 참조객체도 동일한 형태)
@JoinColumn(name = "post_id")
@ManyToOne(fetch = FetchType.LAZY)
private Post post;

이와 같이 @JoinColumn 어노테이션을 사용해 Like 테이블에서 각각의 DB테이블을 참조하고 (name = "member_id") 이런식으로 name 속성을 이용하여 column 이름을 지정해준다.

Like 객체 기준에서 각 객체들과의 관계는 N:1(다대일)이다. 그러므로 @ManyToOne 어노테이션을 사용해 연관관계 매핑을 시켜준다.

여기서 (fetch = FetchType.LAZY) 속성의 "FetchType"은 참조하는 객체들의 데이터를 가져오는 시점을 의미하며 "LAZY"는 "지연로딩" 하겠다는 의미이다.

지연로딩(LAZY Loading) : 데이터를 조회할 때 필요한 정보만 불러오는 방식, 객체가 실제 사용될 때 로딩된다.

아무튼 Like 객체에서는 이렇게 매핑을 하면 되고,

각각의 참조 객체들은 1:N(일대다)관계로 매핑을 해주면 된다.
게시물(Post) 객체로 예를 들면

Post.java

@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Like> likes;

이렇게 @OneToMany 어노테이션을 사용해 1:N 매핑을 해준다. "mappedBy" 속성은 "연관관계의 주인"을 명시해주는 속성이다. (2번의 링크 참고) 그리고 마찬가지 "FetchType.LAZY"로 "지연로딩"을 적용시켜준다.

"cascade", "orpahnRemoval" 이 두 타입은 둘다 연관관계에서 Parent Entity가 삭제 되었을 때, Child Entity도 함께 삭제한다. 그러나 큰 차이점이 있다.

"orphanRemoval" 관계가 끊어진 Child Entity를 자동으로 제거한다. 그러나 "cascade"는 관계가 끊어진 Child Entity를 자동으로 제거하지 않는다. (cascade는 관계가 끊어졌다는 것을 제거로 보지 않기 때문)

이렇다고 한다.

2. Spring Boot 미션 : 게시물, 댓글, 대댓글 수정/삭제 이슈 해결

[Error:Spring Data JPA]Cannot delete or update a parent row: a foreign key constraint fails 해결

3. Spring Boot 미션 : 마이페이지 내가 작성한 게시물, 댓글, 대댓글 응답 처리 완료

마이페이지는 로그인한 사용자가 작성한 게시물, 댓글, 대댓글 그리고 사용자가 "좋아요"한 목록을 조회하는 기능이다.

따로 Entity는 생성하지 않고 테이블에 저장된 모든 데이터 중 현재 로그인 권한인 멤버의 id를 이용해 데이터를 조회하여 응답 받으면 된다.

우선 오늘은 기본적으로 로그인된 사용자가 작성한 게시물, 댓글, 대댓글을 조회하는데 성공했다.

내일은 "좋아요" 리스트를 조회해주기만 하면 된다.


항해5주차 팀미션 중 문제점

문제점이라기보다 너무 아쉬운 부분이다.
Service에서 중복되는 로직들을 가지고 있는 메소드들이 많다고 느낀다. 일단 과제 제출 기한이 있기 때문에 중복이 있더라도 구현을 최우선으로 하고있다.

내일 중으로 나머지 기능 구현 후, 꼭 리팩토링을 해주고 싶다는 욕구가 있다.

0개의 댓글