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)
는 무조건 적고 시작하기!
'Camp > 과제' 카테고리의 다른 글
| [TIL]CH 3 일정 관리 앱 만들기 (0) | 2026.07.01 |
|---|---|
| [계산기 과제 2차] 트러블슈팅 (0) | 2026.06.23 |
| [Java] 계산기 과제 Lv.2 트러블 슈팅- 클래스 분리가 왜 이렇게 헷갈렸나 (0) | 2026.06.19 |
| [Java] 코드카타 트러블 슈팅 (0) | 2026.06.17 |
| Camp/과제[TIL] CH2 Java 계산기 과제 Lv.2 (트러블 슈팅) (0) | 2026.06.16 |