스프링 부트로 하는 첫 프로젝트라 좀 많이 힘들었다.
더욱이 스프링 기초가 제대로 잡혀 있지 않아서 더 힘들었다.
코드리뷰 할 게 너무 많이 밀려서 제대로 하나하나 보기 위해 정리하는 겸, 따로 실습해보는 겸
정리 글을 쓰려고 한다.
또 이렇게 글로 정리하면, 나중에 다른 스프링 부트 프로젝트를 진행할때
수월하게 따라가는 지침서의 역할도 만들 수 있으니 여러모로 장점일 거라는 생각이 들었다.
코드리뷰 #1 데이터베이스 구조 설계
feature branch workflow
새로운 기능을 개발할 때마다 branch를 만들어서 작업한다.
이렇게 작업하면, 새로운 기능은 새로운 branch에 작업하므로 master 브랜치는 항상 bug free 상태를 유지할 수 있어서 지속적 통합(Continuout Integration)을 적용하기 수월하다.
기능 개발을 끝내면 master에 바로 merge하지 않고 branch를 중앙 저장소에 올려 master에 병합해달라고 요청한다(pull request)
DB 설계 단계에 따라 ERD 설계
ERD 설계
스팟, 작성자, 댓글 등 필요한 요소들의 연관관계를 작성한다.
PK는 Primary key로 행을 고유하게 구분해 주는 최소의 정보이고, 모든 테이블에는 primary key가 있어야 하며, 오직 하나의 primary key만 존재할 수 있다.
FK는 Foreign key로 두 테이블 간의 관계를 생성하는 열이다. 또한 다른 테이블의 기본키인 테이블의 필드이다.
코드리뷰 #2 엔티티 연관관계 설정
JPA 엔티티 연관관계 설정
작성한 Bookmark 엔티티 클래스를 예로 들면,
@Entity
public class Bookmark {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "spot_id")
private Spot spot;
}
@Id 어노테이션을 이용해 정의한 필드는 PK임을 지정한다.
@GeneratedValue 어노테이션은 자동생성을 도와준다. startegy는 엔티티의 주키를 사용할때 주키생성 전략을 의미한다. 위에서는 기본 키 생성을 데이터베이스에 위임하는 GenerationType.IDENTITY 를 사용한다.
@JoinColumn 어노테이션은 엔티티의 연관관계에서 외래키를 매핑하기 위해 사용한다. name 속성은 매핑할 외래키의 이름을 지정하는 속성이다. name 속성이 없으면, 해당 엔티티의 PK로 매핑된다. 단순히 FK의 이름을 지정하는 것이다.
Source Entity : @JoinColumn을 사용한 엔티티
Target Entity : @JoinColumn을 사용한 엔티티와 연관관계를 맺은 엔티티
@OneToOne (1:1관계) : 이 어노테이션이 있는 엔티티(Source Entity)를 주인으로 생각하고, name으로 명시한 필드를 FK로 매핑한다. 양방향일 경우 Target Entity의 @OneToOne에 mappedBy가 제대로 지정되어야 제대로 매핑된다.
@ManyToOne (N:1관계) : 이 어노테이션이 인는 엔티티(Source Entity)가 many 에 해당되고 Target Entity가 one에 해당된다.
연관관계별로 @JoinColumn의 주인이 달라지는데 이 부분은 다시 봐야겠다.
@ManyToOne 의 속성으로 지연로딩을 추가할 수 있다.
public class UserLike {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "spot_id")
private Spot spot;
}
지연로딩 속성으로 joincolumn의 target entity에 해당하는 부분의 값을 가져오지 않을 수 있다. 그래서 성능을 향상시킬 수 있다.
그냥 UserLike 한 객체만 출
'spring' 카테고리의 다른 글
[인프런 워밍업 클럽 6차 과제-5/11] 백엔드 (0) | 2024.05.11 |
---|---|
[인프런 워밍업 클럽 4차 과제-5/7] 백엔드 (1) | 2024.05.07 |
[인프런 워밍업 클럽 3차 과제-5/3] (0) | 2024.05.03 |
[인프런 워밍업 클럽 1차 과제-4/29] (0) | 2024.04.29 |
[스프링 부트] 회원 관리 세팅 및 테스트 케이스 작성 - 정리 (1) | 2024.03.14 |