혼자 무작정 코드를 짜려니 대체로 사용하는 구조? 틀?을 도저히 모르겠네요... 그래서 깃헙을 좀 뒤져보다가 분석하기 좋은 클론코딩을 발견했습니다. 최신 기술이 좀 잘 버무려져있어서 좋았습니다. 누군가가 프로젝트로한것 같은데 알고보니 인하대생 3명이었습니다. 너무 반가우면서도 자괴감이... 아무튼 앞으로 코드를 좀 분석하면서 어떻게 구성을 해야 좋을지좀 공부해보려합니다.
https://github.com/Instagram-Clone-Coding/Spring_instagram-clone
GitHub - Instagram-Clone-Coding/Spring_instagram-clone: Instagram Clone Coding - Backend using Spring Framework
Instagram Clone Coding - Backend using Spring Framework - GitHub - Instagram-Clone-Coding/Spring_instagram-clone: Instagram Clone Coding - Backend using Spring Framework
github.com
// Instagram.domain.member.entity
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "blocks")
public class Block {
@Id
@Column(name = "block_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "block_member_id")
private Member blockMember;
@Builder
public Block(Member member, Member blockMember) {
this.member = member;
this.blockMember = blockMember;
}
}
그럼 코드 하나하나의 역할, 의미, 궁금증을 정리해보죠
- @Entity와 @Table 차이점 / 둘 중 하나만 쓴다면?
- @Entity
JPA에서 엔티티 클래스임을 지정하는데 사용 - @Table
데이터베이스 테이블과 엔티티 클래스간의 매핑을 지정,
db에 테이블이 존재하지 않는 경우 -> JPA가 자동으로 생성
@Entity만 사용해도 되나? -> 가능
@Table만 사용해도 되나? -> 불가능
name=? 값이 정해지지 않았다면 클래스명이 defualt
- @Entity
- @JoinColumn의 역할
엔티티 클래스의 테이블에 외래키를 생성하고, 그 외래키를 참조하는 대상 테이블의 기본키와 매핑 - @ManyToOne(fetch = FetchType.LAZY)의 역할
- ManyToOne
N:1 관계 매핑 - FetchType.LAZY
연관된 엔티티를 조회할때 해당 엔티티를 필요로 할 때까지 DB에서 로딩하지 않고 엔티티가 실제로 사용될때 로딩 ( 지연로딩 )- 지연 로딩
데이터를 조회하지 않아도 되는 경우에는 데이터베이스에 접근하지 않고 필요한 시점에만 데이터를 조회함으로써 데이터 접근 횟수를 줄여 속도, 메모리절약이 됩니다.
- 지연 로딩
- ManyToOne
- @Builder는 꼭 필요한가?
매개변수가 많은 경우 객체 생성 코드를 간결하게 작성할 수 있기 때문에 쓰는것이 좋음 - 왜 AccessLevel이 protected 여야 하는가?
상속 관계에서만 기본 생성자를 호출할 수 있으므로 보다 안전하게 객체를 생성 가능
#뜬금 없는 궁금증
- 엔티티 클래스 코드만을 변경해서 데이터베이스 테이블을 수정할수는 없나?
불가능 - 데이터베이스 테이블을 엔티티클래스를 정의해서 매핑하고 싶은데 column이 너무 많아서 일일이 입력하기가 너무 힘들때 좋은 방법이 있을까?
JPA 매핑 정보를 XML 파일에 작성하고 엔티티 클래스와 매핑 정보를 연결하는 방법이 있습니다. 이를 통해 엔티티 클래스 코드에는 매핑 정보를 작성하지 않아도 되므로, 코드 작성을 간소화할 수 있습니다.
'Back-end > Spring 기초개념' 카테고리의 다른 글
Instagram-clone 분석 (3) DTO (0) | 2023.04.23 |
---|---|
Instagram-clone 분석 (2) entity (3) | 2023.04.22 |
@Bean과 @Component (2) | 2023.03.29 |
SOLID 5원칙 (0) | 2023.03.21 |
[JAVA] 내부 클래스, 내부 static 클래스의 역할 (0) | 2023.03.10 |