Camp/과제

[TIL]일정 관리 앱 Develop

taeri7204 2026. 7. 9. 13:10

Spring 과제에서 가장 어려웠던 3가지와 극복 방법

Spring CRUD 과제를 진행하면서 가장 막혔던 부분들을 정리했다.


1. Controller → Service → Repository 데이터가 왜 이렇게 흐를까

Controller:
CreateScheduleRequest request를 받음
Service한테 보냄

Service:
Repository를 호출
DB에서 받은 Schedule Entity를 DTO로 변환해서 반환

Controller:
Service에서 받은 DTO를 JSON으로 변환해서 응답

알겠다 알겠는데 내손으로 구현이 안된다. 

머리속이 뒤죽박죽 섞여서 흐름을 모르겠고 이 행동 다음에 어떤 행동을 해야하지 정형화가 안된다.

결국 ai와 강의, 교안의 도움을 많이 아주 많이 받았다. 


DTO CreateScheduleRequest를 Service에서 처리하면 안 되는 이유

Controller의 책임: "클라이언트의 요청 형태를 이해하고, 응답 형태를 결정"
Service의 책임: "비즈니스 로직 실행 (검증, 데이터 처리)"
Repository의 책임: "DB와 통신"

- Controller가 API 형태를 바꿔도 Service와 Repository는 안 변함
- Repository를 MySQL에서 MongoDB로 바꿔도 Controller와 Service는 안 변함

단일 책임 원칙, 3layer architenture


2. save()가 반환해주는 게 뭐지


```java
Guestbook savedGuestbook = guestbookRepository.save(guestbook);
return new GuestbookResponse(savedGuestbook.getId(), ...);
```

왜 save() 결과를 다시 받아? 이미 저장됐는데 뭘 반환???

save()의 목적을 모르니까, savedGuestbook과 guestbook의 차이가 뭔지 이해 안 됨.



save()가 하는 일:

guestbook (메모리): { name: "태헌", message: "안녕", id: null }
    ↓ (DB에 INSERT)
    ↓
DB: id: 1, name: "태헌", message: "안녕", created_at: 2024-01-01...
    ↓ (결과를 Java 객체로 변환해서 반환)
    ↓
savedGuestbook: { id: 1, name: "태헌", message: "안녕", createdAt: 2024-01-01... }

save()는 "저장했어, 그리고 DB에서 받은 값들(id, createdAt)을 넣어서 이 객체를 줄게"라는 뜻.

원래 guestbook 객체는 id가 없다. 저장 후 id가 생김





1. 계층을 나누는 이유가 있다 (유지보수)
2. DB 조회 결과는 반드시 받아야 한다 (id, 시간 정보 등)
3. 코드와 DB 스키마는 항상 동기화되어야 한다

엔티티 정의 → 레포지토리 → DTO → 서비스 → 컨트롤러

엔티티 만들기
레포지토리 만들기
서비스 만들기
컨트롤러

요청 들어옴 controller>requestdto>service>entity>repository>db
응답해줌 entity>service>responsedto>controller

@PostMapping = @RequestBody
@GetMapping = @PathVariable

Entity 클래스 코드 작성 시, 
1. @Getter
2. @Entity
3. @Table
4. @NoArgsConstructor(access = AccessLevel.PROTECTED)
5. @Id
6. @GeneratedValue(strategy = GenerationType.IDENTITY)
는 무조건 적고 시작하기!