스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제(Tag) 도메인(+ JPA H2 DB 설정)
스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제 도메인
해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.
강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.
제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.
관심 주제(Tag) 도메인
- 관심 주제(Tag)는 엔티티인가 밸류인가?
- 엔티티와 밸류의 차이는 DB에서 테이블로 들어가는지 컬럼으로 들어가는지이다.
- 엔티티다.
- 태그 독자적인 라이프사이클이 있고, 다른 곳(Study)에서도 참조하기 때문이다.
- 밸류라면 독자적인 라이프사이클이 없고 엔티티에 종속되어야 한다.
- Tag 엔티티
- Id
- Title (unique)
- 객체 관점에서의 관계
Account
->Tag
@ManyToMany
Account
에서Tag
를 참조하는 단방향 관계
- 관계 DB 관점에서의 관계
Account
<-AccountTag
->Tag
- 중간에 매개 테이블을 하나 더 생성하여 하는 편이 좋을듯
Account_Tag
에서Account
의PK
참조Account_Tag
에서Tag
의PK
참조
Tag 엔티티 작성
@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Tag {
@Id @GeneratedValue
private Long id;
private String title;
}
AccountTag 엔티티 작성
@Entity
public class AccountTag {
// 조인 컬럼
@ManyToOne
@JoinColumn(name = "account_id")
private Account account;
@ManyToOne
@JoinColumn(name = "tag_id")
private Tag tag;
// 기본 컬럼
@Id @GeneratedValue
private Long id;
}
Account
엔티티와 Tag
엔티티가 바로 @ManyToMany
를 갖지 않고, 유연성을 위해 가운데에 AccountTag
라는 엔티티를 하나 더 만들어주었다.
그리고 각 Account
와 Tag
는 @OneToMany
로 AccountTag
엔티티와 관계를 갖는다.
Account 엔티티에 내용 추가
...
// 조인 컬럼들
// mappedBy 에는 AccountTag 객체의 어떤 값을 참조하여 매핑될 것인지를 선택하는 것이므로,
// Account 타입의 account 밸류를 참조한다고 적는다.
@OneToMany(mappedBy = "account")
private List<AccountTag> accountTags = new ArrayList<>();
...
Account
엔티티는 회원 정보를 불러올 때, 태그 정보를 같이 불러올 일이 있으므로 위와 같이 @OneToMany
를 써주었다. mappedBy
에 들어가는 내용은 내가 참조되는 테이블에서 나를 가리키는 필드명이 무엇인지 적는 것이다.
공식문서의 설명에는 관계를 소유하는 필드명을 적으라고 되어있다. 외래키를 가지는 곳이 연관관계의 주인이므로, 연관관계의 주인은 항상 @XXToMany
의 Many
이다. 그래서 AccountTag
엔티티의 Account
필드에 의해서 매핑되도록 mappedBy = "account"
를 적어주면 된다.
디비 연결 세팅
어떤 쿼리들이 날아가는지 구경하기 위해 디비를 연결했다. 디비는 임의로 h2 디비를 쓸 것이다.
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:tcp://localhost/~/test;
spring.jpa.hibernate.ddl-auto=create
# spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace
위와 같이 세팅해주었다. 위와 같이 세팅하면 어떤 SQL을 날렸는지 나오며, 값 추적도 가능하다.
Author And Source
이 문제에 관하여(스프링과 JPA 기반 웹 애플리케이션 개발 #39 관심 주제(Tag) 도메인(+ JPA H2 DB 설정)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jakeseo_me/스프링과-JPA-기반-웹-애플리케이션-개발-39-관심-주제Tag-도메인-JPA-H2-DB-설정저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)