본문 바로가기
Spring

Spring_4주차-(1)

by shulk 2023. 11. 10.

1. RestTemplate

*서버간 통신을 할때 사용하고 RestTemplate은 스프링에서 HTTP통신 기능을 손쉽게 사용하도록 설계된 템플릿이다.

* RestTemplate 은 Restful원칙을 따르고 동기 방식으로 처리하며 JSON,XML,문자열등으로 주고 받으며 통신한다.

 

RestTemplate 메소드 종류

 

 

RestTemplate 사용해보기

1) 일단 작업은 서비스에서 할거니 서비스 안에 RestTemplate 필드를 만들어주고 생성자 형식으로 주입을 해준다.

build()함수 구현쪽 가보면 new RestTemplate 리턴해준다.

 

2) RestTemplate으로 요청을 보낼 때 Header에 특정 정보를 같이 전달 하고 싶으면

exchange() 메소드의 예시인데 URI 클래스를 이용해서 다른 서버에 요청할 URL 만들어주고 

RestTemplate메소드  이용해서 다른 서버에 요청을 보낸다.

 

 

2. Entity 연관 관계

* DB 테이블에서 테이블끼리는 방향이라는 개념이 없다.(join으로 어느 테이블에서던 반대쪽 테이블 조회 가능해서)

 

* 하지만 Entity클래스 세계에서는 객체 형태이기 떄문에 서로 참조하기 위해 상대 Entity의 타입을 필드로 가지고 있어야해서 방향이라는 개념이 있다.

(만약 A,B Entity있는데 A에는 B관련 필드있고 B에는 A에 관련 필드없으면 A에서만 B의 정보를 볼수있고 B에서 A는 불가)

 

*단방향: 두 Entity 관계에서 한쪽의 Entity만 참조하는 형식

*양방향: 두 Entity 관계에서 각 Entity가 서로의 Entity를 참조하는 형식

3.  @OneToOne (1 대 1 관계)

 

● 1 :1의 단방향

* Entity에서 외래 키의 주인은 일반적으로 N(다)의 관계인 Entity 이지만 1 대 1 관계에서는 외래 키의 주인을 직접 지정해야 한다. ( 외래 키의 주인만 외래 키 등록,수정,삭제 가능하고 주인 아닌쪽은 해당 외래 키 로우 읽기만 가능)

 

* @JoinColumn()은 외래 키의 주인을 설정하고, 컬럼명, null 여부, unique 여부 등을 지정할 수 있다.
예를들어 음식,유저 Entity 있고 음식이 주인일때 음식 Entity안에서 @JoinColumn(name="user_id") 한다.

 

*@JoinColum는 생략이 가능하다 default옵션으로 해당 테이블이름에 _id 붙여줘서.
하지만 1:N관계에서는 그러면 중간 테이블이 생겨서 문제 생기니 걍 적는게 좋다. 

 

● 1:1의 양방향

* 양방향일때는 주인 아닌쪽에서 상대가 주인이다 알려야해서 mappedBy를 이용해서 한다.

 

* 음식,유저 Entity 있을때 음식이 주인이고,양방향으로 할시 유저 Entity안에 음식의 필드에 

 

@oneToOne 어노테이션에 (mappedBy="user") 해준다. (음식은 위에 단방향 코드 예시로 했을시)

* mappedBy의 값은 주인쪽에서 주인 아닌 객체 참조 하고있는 필드명 적어주면 된다.

 

4. @ManyToOne  ( N 대 1 관계)

● N:1의 단방향

* 1:1의 단방향이랑 조건들이 똑같고 주인쪽에서 @ManyToone() 어노테이션을 사용한다.

 

● N:1의 양방향

주인이 아닌 1쪽인 한명의 고객이 음식의 정보를 여러개 가져야하니 고객쪽에 List로 음식의 객체들을 저장 할 수 있게 한다. 

* 고객 Entity에 음식의 정보를 List형식으로 한다해서 실제 DB의 해당 컬럼에 리스트 형식으로 저장되는건 아니다.

 

5. @OneToMany (1 대 N 관계)

● 1:N의 단방향

* 지금까지 주인이 외래 키를 관리 한다 했는데 1:N관계에서는 주인이 아닌쪽이 외래키를 갖고 있는다.

 

 

* @JoinColumn은 주인쪽에서 한다 했는데 oneToMany라 주인 아닌쪽에 테이블에서 외래키 갖는다 했으니 

joinColumn의 name값을 주인 이름_id로 한다.

 

* 외래 키를 음식 Entity가 직접 가질 수 있다면 INSERT 발생 시 한번에 처리할 수 있지만 실제 DB에서 외래 키를 고객 테이블이 가지고 있기 때문에 추가적인 UPDATE가 발생된다는 단점이 있다.

 

● 1:N의 양방향

1:N에서는 양방향 관계가 존재하지 않는다 하지만 어떻게 해서든 할 수는 있다.

* 주인이 아닌쪽 Entity에서 mappedBy 옵션을 사용해야 하지만 @ManyToOne 어노테이션은 mappedBy 속성을 제공하지 않는다.

 

 

6. @ManyToMany (N 대 M 관계)

N:M의 관계를 위해 중간 테이블이 자동으로 생성된다. 하지만 생성되는 중간 테이블을 컨트롤하기 어렵기 때문에 따로 직접 중간 테이블 생성 하게 하는 방법도 있다. 

 

● N:M의 단방향

* 해당 Entity 테이블에 외래키 생성하는게 아닌 중간 테이블에서 생성하고 관리한다. 

 

*JoinTable이용해서 중간테이블을 설정 해주고,

name은 중간 테이블 이름

joinColums는 현재 위치인 Food Entity 에서 중간 테이블로 조인할 컬럼 설정,inverseJoinColums는 반대쪽 설정이다.

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToMany
    @JoinTable(name = "orders", 
    joinColumns = @JoinColumn(name = "food_id"), 
    inverseJoinColumns = @JoinColumn(name = "user_id")) 
    private List<User> userList = new ArrayList<>();
}

 

● N:M의 양방향

 

* 양방향일땐 주인 아닌 반대쪽 Entity에서는 mappedBy로 상대쪽이 내 주인이다 알려주고 List형식 필드 만들어주면된다.

 

'Spring' 카테고리의 다른 글

Spring_5주차-(1)  (0) 2023.11.28
Spring_4주차-(2)  (0) 2023.11.14
Spring_3주차-(1)  (0) 2023.11.07
Spring_2주차-(2)  (0) 2023.11.02
Spring_2주차-(1)  (0) 2023.11.02