Spring 숙련 - 4주차 (RestTemplate, Entity 연관 관계)

ayboori·2023년 6월 27일
0

Spring

목록 보기
7/24

RestTemplate

한 서버에서 다른 서버에 요청을 진행할 때 사용할 수 있도록 Spring에서 제공하는 기능

RestTemplate은 주입 받을 때 단순 생성자가 아닌, build를 사용해야 한다

private final RestTemplate restTemplate;

// RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성합니다.
public RestTemplateService(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}

아래 깃허브 링크에 상세히 주석을 달아두었음!
1) 서버 역할
2) 클라이언트 역할


Entity 연관 관계

JPA Entity 간의 관계 설정

일반 DB 테이블에는 방향의 개념이 없지만, JPA Entity에서는 참조가 필요하기 때문에 방향이 필요하다.

Entity 내에서는 테이블 관의 연관 관계를 N : 1 등의 관계를 설정한다.
서로의 정보를 조회하기 위해 실제 컬럼으로 존재하지는 않지만 Entity 상태에서 다른 Entity를 참조하기 위해 아래와 같은 방법을 사용한다.

양방향 관계

DB 테이블에 현재 음식 Entity와 고객 Entity는 서로를 참조

  • 음식
        @Entity
        @Table(name = "food")
        public class Food {
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;
            private String name;
            private double price;
        
            @ManyToOne
            @JoinColumn(name = "user_id")
            private User user;
        }
  • 고객
        @Entity
        @Table(name = "users")
        public class User {
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;
            private String name;
        
            @OneToMany(mappedBy = "user")
            private List<Food> foodList = new ArrayList<>();
        }
  • 한명의 고객은 여러번 주문이 가능한 상황입니다.
  • 이를 Entity에서 여러번 가능함을 표현하기 위해 Java 컬렉션을 사용하여 표현한다 List<Food> foodList = new ArrayList<>()

단방향 관계

한 엔티티에서만 상대 엔티티를 참조한다.


1대 1 관계 - @OneToOne

단방향 관계

외래 키의 주인 정하기

  • N대 1의 경우 N이 외래키의 주인이지만, 1대 1에서는 수동으로 지정해야 한다.
  • 외래 키 주인만이 외래 키 를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능
  • 주인이 아닌 쪽은 @OneToOne (참조)도 사용하지 않음
  • @JoinColumn() : 외래 키의 주인이 활용하는 애너테이션
    컬럼명 (name = " "), null 여부, unique 여부 등을 지정
    @Test
    @Rollback(value = false) // 테스트에서는 @Transactional 에 의해 자동 rollback 됨으로 false 설정해준다.
    @DisplayName("1대1 단방향 테스트")
    void test1() {

        User user = new User();
        user.setName("Robbie");

        // 외래 키의 주인인 Food Entity user 필드에 user 객체를 추가해 줍니다.
        Food food = new Food();
        food.setName("후라이드 치킨");
        food.setPrice(15000);
        food.setUser(user); // 외래 키(연관 관계) 설정

        userRepository.save(user);
        foodRepository.save(food);
    }

양방향 관계

  • 양방향의 경우에도 외래 키의 주인을 정해야 한다.
  • 외래 키의 주인이 아닌 엔티티에서 mappedBy 옵션을 사용한다
    - 이때 mappedBy의 속성값은 외래 키의 주인인 상대 Entity의 외래키 필드명 @OneToOne(mappedBy = "user")
  1. 외래 키의 주인 Entity에서 @JoinColumn() 애너테이션을 사용하지 않아도 default 옵션이 적용되기 때문에 생략이 가능합니다.
    • 다만 1 대 N 관계에서 외래 키의 주인 Entity가 @JoinColumn() 애너테이션을 생략한다면 JPA가 외래 키를 저장할 컬럼을 파악할 수가 없어서 의도하지 않은 중간 테이블이 생성됩니다.
    • 따라서 외래 키의 주인 Entity에서 @JoinColumn() 애너테이션을 활용하시는게 좋습니다.
  2. 양방향 관계에서 mappedBy 옵션을 생략할 경우 JPA가 외래 키의 주인 Entity를 파악할 수가 없어 의도하지 않은 중간 테이블이 생성되기 때문에 반드시 설정해주시는게 좋습니다.

외래 키의 주인인 필드에 객체를 넣는다!

외래 키의 주인만이 외래키를 control 할 수 있다.
양방향의 경우 주인이 아니어도 외래키를 조회할 수는 있다. 즉, 외래키의 주인이 아닌 곳에서 조회하고 싶다면 양방향 설을 해야 한다.

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글