내일배움캠프 Spring 25일차 TIL

Skadi·2024년 1월 26일
0

스프링 숙련

1. RestTemplate & Open API

RestTemplate란?

  • 서비스 개발을 진행하다보면 라이브러리 사용만으로는 구현이 힘든 기능들이 무수히 많이 존재
    - 우리의 서비스에서 회원가입을 진행할 때 사용자의 주소를 받아야 한다면
    • 주소를 검색할 수 있는 기능을 구현해야하는데 직접 구현을 하게되면 많은 시간과 비용
    • 카카오에서 만든 주소 검색 API를 사용한다면 해당 기능을 간편하게 구현

RestTemplate의 Get 요청

  • Client 입장
    1. RestTemplate 주입
    2. 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청합니다

  • Server 입장
    1. Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환합니다.
    2. 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청합니다

RestTemplate의 Post 요청

  • Client 입장
    1. 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청합니다.

  • Server 입장
    1. Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환합니다.

RestTemplate의 exchange 요청

  • Client 입장
    1. RestTemplate의 exchange를 사용합니다.

  • Server 입장
    1. 전달된 header와 body의 정보를 확인할 수 있습니다.

2.JPA 더 나아가기

Entity 연관 관계

  • 연관관계 고민
    - 고객이 음식을 주문 시, 주문 정보는 어느 테이블에 들어가야 할까요?(고객?, 음식?)

  • 연관관계 예시
    - 고객 1명은 음식 N개를 주문할 수 있습니다. (고객 : 음식 = 1 : N 관계)
    - 음식 1개는 고객 N명에게 주문될 수 있습니다. (음식 : 고객 = 1 : N 관계)
    - 결론적으로 고객과 음식은 N : M 관계입니다. (고객 : 음식 = N : M 관계)
    - N : M 관계인 테이블들의 연관 관계를 해결하기 위해 orders 테이블처럼 중간 테이블을 사용

    • 고객 1명은 주문을 여러번 할 수 있습니다. (고객 : 주문 = 1 : N)
    • 음식 1개는 주문이 여러번 될 수 있습니다. (음식 : 주문 = 1 : N)
  • DB 테이블 사이의 방향
    - DB 테이블들간의 관계에서 방향의 개념이 존재하는가 : 존재하지 않는다 (JOIN문을 사용하여 조회)

    • 하지만 JPA Entity에서는 존재한다.

    JPA (음식 : 고객 = N : 1) (양방향)
    - 음식

    • @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 foodList = new ArrayList<>() 이처럼 표현할 수 있습니다.
    • DB 테이블에서는 고객 테이블 기준으로 음식의 정보를 조회하려고 할 때 JOIN을 사용하여 바로 조회가 가능하지만 고객 Entity 입장에서는 음식 Entity의 정보를 가지고 있지 않으면 음식의 정보를 조회할 방법이 없습니다.
    • 따라서 DB 테이블에 실제 컬럼으로 존재하지는 않지만 Entity 상태에서 다른 Entity를 참조하기 위해 이러한 방법을 사용합니다.
    • 현재 음식 Entity와 고객 Entity는 서로를 참조하고 있습니다.
      - 이러한 관계를 양방향 관계라 부릅니다
  • JPA (음식 : 고객 = N : 1) (단방향)
    - 음식

    • @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;
      }
      
    • 음식 Entity에서만 고객 Entity를 참조할 수 있습니다.
      - 이러한 관계를 단방향 관계라 부릅니다.
      - 고객 Entity에는 음식 Entity의 정보가 없기 때문에 음식 정보를 조회할 수 없습니다.

0개의 댓글