💻Today's Schedule
09:30 ~ 10:00 1:1 커리어 코칭
13:00 ~ 16:00 개인 학습
16:00 ~ 18:00 베이직 6회 차
18:00 ~ 19:00 저녁 식사
19:00 ~ 21:00 개인 학습
✍ Today I Learned
RestTemplate
RestTemplate이란?
RestTemplate은 Spring 프레임워크에서 제공하는 유틸리티 클래스로, 서버 간의 HTTP 통신을 간편하게 처리할 수 있게 해 준다. 서버가 다른 서버에 HTTP 요청을 보내고 응답을 받아오는 작업을 보다 쉽게 구현할 수 있도록 도와준다.
RestTemplate의 주요 기능
1. 프로젝트 설정
- 프로젝트를 시작하기 위해 Spring Initializr를 사용하여 필요한 의존성을 추가한 후 프로젝트를 생성한다. 두 개의 프로젝트를 만들어, 하나는 클라이언트 입장에서 서버 역할을 하고, 다른 하나는 실제 서버 역할을 수행하도록 한다.
2. GET 요청 처리:
- getForEntity 메서드를 사용하여 GET 요청을 보낼 수 있다. 이 메서드는 URI를 지정하고, 서버의 응답을 원하는 타입의 객체로 받을 수 있다.
- 예를 들어, URI를 구성한 후 getCallObject 메서드를 통해 특정 서버에 GET 요청을 보내고, ItemDto 객체로 응답을 받을 수 있다.
public ItemDto getCallObject(String query) {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/get-call-obj")
.queryParam("query", query)
.encode()
.build()
.toUri();
ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);
return responseEntity.getBody();
}
3. POST 요청 처리:
- postForEntity 메서드를 사용하여 POST 요청을 처리할 수 있다. 이 메서드는 데이터를 서버로 전송하고, 서버의 응답을 객체로 반환받는다.
- 요청 URL과 함께 전송할 데이터를 JSON 형태로 변환하여 HTTP Body에 포함시킬 수 있으며, 서버의 응답은 지정된 클래스 타입으로 자동 변환된다.
public Item postCall(String query, UserRequestDto userRequestDto) {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/post-call")
.encode()
.build()
.toUri();
ResponseEntity<Item> responseEntity = restTemplate.postForEntity(uri, userRequestDto, Item.class);
return responseEntity.getBody();
}
4. Exchange 메서드 활용:
- exchange 메서드는 모든 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지원하며, 복잡한 요청을 구성할 때 사용된다. URI, 헤더, 바디 등을 포함한 요청을 RequestEntity 객체로 구성하여 한 번에 전송할 수 있다.
- 이 방법은 특정 헤더 정보나 인증 토큰 등을 함께 전송해야 할 때 유용하다.
public List<ItemDto> exchangeCall(String token) {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/exchange-call")
.encode()
.build()
.toUri();
RequestEntity<User> requestEntity = RequestEntity
.post(uri)
.header("X-Authorization", token)
.body(new User("Robbie", "1234"));
ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
return fromJSONtoItems(responseEntity.getBody());
}
Entity 연관 관계
Spring에서 JPA를 사용해 데이터베이스와 상호작용할 때, 엔티티 간의 연관관계는 매우 중요한 개념이다. 이를 통해 객체 간의 관계를 데이터베이스에 효율적으로 맵핑할 수 있다.
1. 1대 1(One-to-One) 관계
- 단방향 관계: @OneToOne 애너테이션을 사용하여 1대1 관계를 설정할 수 있다. 예를 들어, 음식(Food) 엔티티가 고객(User) 엔티티와 1대1 관계를 가지도록 설정할 수 있다. 외래 키의 주인을 지정해야 하며, 이 주인만이 외래 키를 수정, 삭제할 수 있다.
- 양방향 관계: 양방향 관계를 설정하려면, 한쪽 엔티티에서 @OneToOne(mappedBy = "user")를 사용해 상대방 필드를 참조하면 된다. 이 경우 양쪽 엔티티에서 서로를 참조할 수 있다.
2. 1대다(One-to-Many) 관계
- 단방향 관계: @OneToMany와 @ManyToOne 애너테이션을 조합하여 1대다 관계를 설정한다. 예를 들어, 한 명의 고객이 여러 개의 음식을 주문할 수 있는 관계를 설정할 때 사용한다. 외래 키는 보통 '다' 쪽에 위치한다.
- 양방향 관계: @OneToMany(mappedBy = "user")와 같은 방식으로 설정할 수 있으며, 양쪽에서 서로를 참조할 수 있도록 한다. 이 경우 주의할 점은 mappedBy를 통해 외래 키의 주인을 명확히 지정해야 한다는 것이다.
3. 다대다(Many-to-Many) 관계
- 중간 테이블 사용: @ManyToMany 애너테이션을 사용해 다대다 관계를 설정할 수 있다. 예를 들어, 여러 고객이 여러 음식을 주문할 수 있는 관계를 설정할 때 중간 테이블을 사용하여 이러한 관계를 구현할 수 있다. @JoinTable을 사용해 중간 테이블과 매핑할 수 있다.
- 주의사항: 다대다 관계는 중간 테이블의 제어가 어렵기 때문에, 실무에서는 다대다 관계를 풀어 1대다와 다대 1 관계로 재구성하는 것이 일반적이다.
📝 회고
1:1 커리어 코칭이 있었다. 확실히 그동안의 튜터링보다는 직설적이고 객관적인 시선으로 부족했던 부분을 어떻게 보완해야 하는지, 그리고 어떤 방향으로 나아가야 하는지 답변해 주셨다. 혼자 고민하고 정리해 온 속마음을 들킨 기분이라 당황스럽기도 했지만 이번 커리어 코칭을 통해 동기 부여가 확실히 된 것 같다.
다만 경력전환에 대한 고민은 내배캠이 끝날 때까지 이어지지 않을까~.. 이번 주말에는 앞으로의 방향성을 구체화해 봐야겠다. 내배캠에 시스템에 이제 좀 적응했는데 그 덕에 마음이 해이해졌나 보다. 벌써 한 달이 훌쩍 지났지만 부족한 것이 너무 많다.
🔖 Weekend Goal
- 스프링 개인 과제
- 스케쥴 정리하기