Post

TIL-Spring 숙련주차(2)

2024-05-22

오늘의 학습 🌠


1

알고리즘 코트카타


  • SQL
1
2
3
4
5
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME IS NULL
ORDER BY A.DATETIME
LIMIT 3
  • 동물 보호소에 들어온 동물 테이블에 입양을 보낸 동물 테이블을 LEFT JOIN한 후 입양을 보낸 날짜가 NULL 값이 입양을 보내지 않은 동물임을 나타냄

  • 결과를 보호 시작일 순으로 조회하고 가장 오래 보호소에 있던 동물 3마리로 제한


Entity 연관 관계


  • DB 테이블에서는 테이블 사이의 연관관계를 FK(외래 키)로 맺을 수 있고 방향 상관없이 조회가 가능함.
  • Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있음.

  • 하지만 상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없음.

  • 따라서 Entity에서는 DB 테이블에는 없는 방향의 개념이 존재함.

  • DB 테이블에는 방향이라는 개념이 없지만 Entity 클래스 세계에서는 객체 형태이기 때문에 서로 참조하기 위해 상대 Entity의 타입을 필드로 가지고 있어야 함. 그렇기 때문에 그런 참조할 만한 필드가 없다면 조회가 불가능한 상황이 발생을 해서 방향이라는 개념이 생기게 됨. 그래서 서로 상대방의 Entity를 참조하고 있다면 양방향, 한쪽이라고 참조하지 못하고 있다면 단방향임.


1대1관계


  • @OneToOne
    • @OneToOne 1대 1관계를 맺어주는 역할
  • 단방향 관계
    • 외래 키의 주인 정하기
      • Entity에서 외래 키의 주인은 일반적으로 N(다)의 관계인 Entity이지만 1대 1관계에서는 외래키의 주인을 직접 지정해야함.
      • 외래 키 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능함.
      • @JoinColumn()은 외래 키의 주인이 활용하는 애너테이션
        • 컬럼명, null 여부, unique 여부 등을 지정할 수 있음.
  • 단방향이라면 외래키의 주인만 상대 Entity 타입의 필드를 가짐. @JoinColumn() 을 활용해서 키의 속성을 설정함.

  • 음식 Entity
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}
  • 고객 Entity
1
2
3
4
5
6
7
8
9
10
11
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "user")
    private Food food;
}
  • 양방향일 때는 이 외래키의 주인이 “누구다”라고 알려줘야 됨.

  • 예를들어 음식 Entity가 외래 키의 주인인 경우 반대편인 고객 Entity에서 mappedBy 옵션을 사용함.

  • mappedBy 옵션 속성 값 : 외래키의 주인인 상대 Entity에 있는 필드명을 의미

  • 양방향이라면 외래키의 주인은 상대 Entity 타입의 필드를 가지면서 @JoinColumn() 을 활용해서 외래키의 속성을 설정 해주고 추가적으로 상대 Entity는 외래키의 주인의 타입의 필드를 가지면서 mappedBy 옵션을 사용하여 속성값으로 외래키의 주인 Entity에 선언된 @JoinColumn() 으로 설정되고 있는 필드명을 넣어주면 됨.

  • 테이블에서는 방향이 없지만 객체에서는 방향이 존재하고 방향이 존재하기 때문에 외래키의 주인이 아닌 쪽에서 상대 Entity를 조회하고 싶다면 양방향 설정을 해야함.

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.