SPRING

Spring Boot 일정 관리 프로젝트 고민 기록

도원좀비 2025. 3. 25. 10:40

 

1️⃣DTO와 Entity의 책임 분리

객체 역할
RequestDto 클라이언트의 입력 데이터 전달 (예: 일정 생성 요청)
Entity (Schedule, Author) 도메인 객체, DB 저장/수정/삭제용
ResponseDto 클라이언트 응답용. Entity로부터 필요한 정보만 가공

✅ 저장을 위한 객체는 Entity , 응답을 위한 객체는 ResponseDto 로 명확히 구분해야 함
ResponseDto  DB 저장용으로 사용하는 건 설계 상 부적절


2️⃣반환 타입 일치 원칙

  • 메서드의 return  값은 선언된 반환 타입과 정확히 일치해야 한다.
  • 예: public  ScheduleResponseDto  saveSchedule (...)  이면,
    return  뒤에는 반드시 ScheduleResponseDto  객체가 와야 함
  • 실무에서는 서비스 → 레포지토리까지 모든 흐름에서 반환 타입이 일치하는지 확인하는 게 중요

3️⃣Entity 생성 책임 → 내부로 이동 (팩토리 메서드)

기존에는 Service에서 직접 Entity를 생성했지만,
Entity 내부에 팩토리 메서드를 두어 책임을 위임하면 더 명확한 설계가 된다.

// 이전 방식
new Schedule(dto.getTitle(), ...);

// 개선 방식
Schedule schedule = Schedule.create(dto);

 


4️⃣메인 유효성 검증은 Entity에서 수행

author.validateExistence();
schedule.validatePassword(input);

→ 비즈니스 도메인의 유효성 판단은 Entity의 책임
→ Service는 흐름만 조율하고, 검증은 도메인 객체에서 수행


5️⃣DB 시간과 Java 시간

  • Java에서 new Timestamp(System.currentTimeMillis())로 만든 시간은 DB에서 가져온 값이 아님
  • DB에 저장된 updated_date 를 정확히 사용하려면 insert 후 다시 select 해야 함
  • 하지만 대부분의 경우, 직접 생성한 시간으로 insert & 응답을 같이 쓰면 충분히 실용적이고 효율적

6️⃣ScheduleResponseDto는 어떤 값을 포함해야 하는가?

  • 클라이언트에게 필요한 정보만 담기 (ex. 제목, 내용, 작성자 이름, 수정일시)
  • 비밀번호 같은 민감 정보는 포함 ❌
  • 불변 객체로 설계하는 것이 바람직 (생성자 또는 Builder 패턴)

7️⃣메서드 선언 구성요소

public ScheduleResponseDto updateSchedule(Long scheduleId, String title, ...)
요소 설명
public 접근 제어자
ScheduleResponseDto 반환 타입
updateSchedule 메서드 이름
(Long scheduleId, ...) 매개변수 목록

 


8️⃣클라이언트 요청 흐름 정리

클라이언트 요청(JSON)
 → Controller (@RequestBody → RequestDto 매핑)
 → Service (검증 + Entity 생성)
 → Repository (DB 저장)
 → ResponseDto 생성
 → Controller 응답