Dev-Kyuu
article thumbnail

✏️ 주특기 숙련주차(Spring) 문제

서점 서비스를 구현해 볼까요?
항해서점이 제주도에 분점을 냈습니다.
(서점(BookStore) , 책(Book) , 회원(Member), 구매(Purchase) Entity 가 있습니다.)

[공통 요구사항]
ERD, SQL을 참고하여 구현해 주세요.(컬럼 명은 자유롭게 하셔도 좋습니다.) nullable 등의 세부조건은 실제 서비스를 구현한다고 생각하시고 서비스 관점에서 자유롭게 하셔도 좋습니다.

 

 

📍 Exam 1.

책 재고가 부족하여 다음주에 책들이 새롭게 들어오기로 했습니다.

책을 서점에 등록하려고 합니다. 책(Book) 과 서점(BookStore)의 연관관계를 맺어보세요!

 

[요구사항]

다대일 단방향 연관관계를 적용해주세요.

 

[ERD]

 

[수행 코드]

  • BookStore ⬅️ Book  테이블에 다대일 단방향 연관관계를 적용한다.
  • Book Entity에 @ManyToOne 어노테이션을 이용해서 작성한다.
@Getter
@Entity(name="Book")
@NoArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String author;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int price;

    @Column(nullable = false)
    private int quantity;

    @ManyToOne
    @JoinColumn(name = "BOOKSTORE_ID", nullable = false)
    private BookStore bookStore;

}

이 부분을 정리하다가 추가적으로 알게 된 점이 있다.

@JoinColumn 조인컬럼에 대한 이야기인데 조인 컬럼은 외래키를 매핑할 때 사용하고, Name속성에는 매핑할 외래키 이름을 지정한다.

 

근데 ! 이 어노테이션은 생략 할 수 있다는 점이다.

 

@JoinColumn: 조인 컬럼은 외래 키를 매핑할 때 사용한다. name 속성에는 매핑할 외래 키 이름을 지정한다. 회원과 팀 테이블은 TEAM_ID 외래 키로 연관관계를 맺으므로 이 값을 지정하면 된다. 이 어노테이션은 생략할 수 있다.

 

그래서 테스트를 해보았다. JoinColumn이 있을때와 없을때 차이가 있는지 ‼️

놀랍게도 아무런 차이가 없었다 .. ! @JoinColumn은 엔티티간 조인과는 관계없이 외래키 이름 지정을 위해서만 사용하는 것인데 

생략이 될 경우 알아서 @ManyToOne의 대상이 되는 엔티티의 이름_id를 대상으로 삼는 것 같다.

오늘도 또 하나 알아버렸다 ~~ 😎

 

📍 Exam 2.

서점(BookStore)에서 책(Book)을 관리하려고 하는데 현재 구조로는 개발 하기가 불편하네요.

연관관계를 수정해 보세요!

 

[요구사항]

다대일 양방향 연관관계를 적용해주세요.

 

[ERD]

 

[수행 코드]

  • BookStore ➡️ Book  테이블에 일대다 관계를 추가로 설정하여 양방향 관계를 적용한다.
  • BookStore Entity에 @OneToMany 어노테이션을 이용해서 작성한다.

✨ 여기서 mappedBy를 사용하는데 이 부분은 연관관계의 주인을 지정해줘 ~ 라는 말과 같다.

   : 주인이라하면 약간 아리송한데 두개의 테이블 중 외래키를 관리(등록, 수정)할 대장을 지정해주면 된다.!

   : 주인이 아닌쪽은 읽기만 가능!

 

 

📍 Exam 3.

항해서점 제주점이 드디어 회원제를 적용하기로 했습니다.

서점(BookStore)에서 회원(Member)을 관리할 수 있도록 연관관계를 맺어보세요!

 

[요구사항]

일대다 단방향 연관관계를 적용해주세요.

 

[ERD]

 

[수행 코드]

  • BookStore  ➡️  Member  테이블에 일대다 관계를 설정하여 양방향 관계를 적용한다.
  • BookStore Entity에 @OneToMany 어노테이션을 추가하여 작성한다.

*) 관계가 헷갈릴 때 = 만약 OneToMany(1:n) 이라면 1인쪽 엔티티에서 추가 하면 된다

: ex ) 서점이 1일때 n개의 멤버가 존재 할 수 있다.

 

 

📍 Exam 4.

항해서점 제주점에서 회원(Member)이 구매한 책(Book)을 관리하려고 합니다.

회원(Member)과 책(Book)의 연관관계를 맺어보세요!

 

[요구사항]

다대다를 사용하지 말고 구현해 보세요.

구매(Purchase) Entity를 사용하세요.

* 이거 약간 서브웨이 색 같다 ㅋ

 

[ERD]

 

[수행 코드]

  • Book ➡️ Purchase , Member ➡️ Purchase 테이블에 일대다 관계를 설정한다. (@OneToMany)
  • Purchase ➡️ Book,  Member  ➡️ Book 테이블의 다대일 관계를 설정하여 양방향 관계를 적용한다.  (@ManyToOne) 
  • BookStore Entity에 @OneToMany 어노테이션을 추가하여 작성한다.

Book 테이블
Member 테이블
Purchase 테이블

profile

Dev-Kyuu

@kyuu_ng

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!