che01 님의 블로그
User API 응답에서 createdAt, updatedAt 누락 이슈 해결기 본문
오늘의 핵심 문제
User 엔티티의 생성일/수정일 필드가 API 응답에 포함되지 않는 문제
Problem
증상
- User 엔티티가 BaseEntity를 상속받아 createdAt, updatedAt 필드를 가지고 있음
- 하지만 API 응답에서 해당 필드들이 전혀 나오지 않음
- 데이터베이스에는 정상적으로 저장되고 있었음
예상했던 원인들
- JPA 설정 문제?
- BaseEntity 상속 문제?
- JSON 직렬화 문제?
Root Cause Analysis
실제 원인
DTO에 해당 필드가 없었기 때문
Spring Boot에서 API 응답은 다음과 같은 흐름을 거친다:
Entity → Service (DTO 변환) → Controller → JSON 응답
아무리 Entity에 필드가 있어도, DTO에 해당 필드가 없으면 API 응답에 포함되지 않는다.
문제가 된 코드 구조
// UserResponseDto - 생성일/수정일 필드 누락
public class UserResponseDto {
private Long id;
private String email;
private String name;
// createdAt, updatedAt 필드가 없었음!
}
🔧 Solution
1. UserResponseDto 수정
public class UserResponseDto {
private Long id;
private String email;
private String name;
private LocalDateTime createdAt; // 추가
private LocalDateTime updatedAt; // 추가
// 생성자도 함께 수정
public UserResponseDto(Long id, String email, String name,
LocalDateTime createdAt, LocalDateTime updatedAt) {
this.id = id;
this.email = email;
this.name = name;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
}
2. UserService 수정
public UserResponseDto getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found"));
return new UserResponseDto(
user.getId(),
user.getEmail(),
user.getName(),
user.getCreatedAt(), // 추가
user.getUpdatedAt() // 추가
);
}
3. 다른 DTO들은 수정하지 않은 이유
- SignUpRequestDto: 회원가입 요청용 - 생성일/수정일 불필요
- SignUpResponseDto: 회원가입 응답용 - 생성일/수정일 불필요
- UpdatePasswordRequestDto: 비밀번호 변경 요청용 - 생성일/수정일 불필요
용도에 따라 필요한 필드만 포함하는 것이 DTO의 올바른 사용법
1. DTO의 역할과 중요성
- DTO는 API 응답의 구조를 결정한다
- Entity에 필드가 있어도 DTO에 없으면 응답에 포함되지 않음
- 각 DTO는 특정 용도에 맞게 필요한 필드만 포함해야 함
2. Spring Boot의 데이터 흐름 이해
Database ←→ Entity ←→ Repository ←→ Service (DTO 변환) ←→ Controller ←→ JSON
3. 트러블슈팅 접근법
- 증상을 정확히 파악하기: "API 응답에 필드가 없다"
- 데이터 흐름을 따라가기: Entity → Service → Controller → JSON
- 각 단계별로 확인하기: Entity에는 있는가? DTO에는 있는가? Service에서 전달하는가?
Next Steps
- 로그인(인증) 기능 구현 예정
- Cookie/Session 기반 인증 필터 구현
- 조건 검증 및 예외 처리 완성
회고
오늘의 문제는 사소해 보이지만 중요한 개념을 다시 확인하게 해주었다. Entity와 DTO의 역할 분리와 Spring Boot의 데이터 흐름을 정확히 이해하는 것이 얼마나 중요한지 깨달았다. 앞으로는 API 응답 관련 문제가 생기면 DTO부터 먼저 확인해야겠다.