Entity를 Dto로 변환

iy·2024년 1월 24일
0

❔ 이 과정이 필요했던 이유
내 일정 관리 프로그램을 만드는 과제를 진행했는데 마지막으로 구현했던 모든 일정 불러오는 부분에서 비밀번호 반환을 받는 것을 발견했다.
일반적으로도 문제가 된다 생각이 드는데 과제 설명에 분명하게 반환 받을 때 비밀번호는 제외하라고 명시되어있었다.
그래서 반환값에서 password 부분을 빼려고 시도했다.

처음엔 Repository List 타입을 Dto로 무작정 바꿔보려고 했는데..

// 기존 코드
List<Schedule> findAllByOrderByCreatedDateDesc();

// 변경 코드
List<ReadResponseDto> findAllByOrderByCreatedDateDesc();

당연히 실패했다.
JPARepository의 역할은 Entity에 의해 생성된 DB에 접근하는 메서드들의 집합인 인터페이스로 entity가 아닌 dto에 직접 접근하는 것은 불가능하다.

그럼 혹시 서비스에서 로직으로 이 값을 빼주는 과정이 필요한건가..? 싶었는데 뭔가 코드가 많이 복잡해질 거 같았다. 다른 방법이 있을 거 같아서 튜터님께 질문을 드렸고

Dto를 받아올 수 없으니 서비스단에서 Entity 를 Dto로 변환해줘야 한다는 답을 들을 수 있었다.

💡 Entity를 Dto로 변환하는 법

우선 이미 다 짜여진 로직이여서 최대한 서비스 로직만 건드리고 싶었다.
검색으로 찾아보니 builder사용해서 dto에 entity값을 dto로 변환하는 메서드 생성이 많이 나왔는데 이 부분은 나중에 builder에 대해 더 공부해서 사용해보기로 하고 지금은 서비스단에서 로직으로 entity -> dto로 바꿔주었다.

List<Schedule> scheduleList = scheduleRepository.findAllByOrderByCreatedDateDesc();
List<ReadResponseDto> scheduleListToDto = scheduleList.stream()
                .map(m -> new ReadResponseDto(m)).collect(Collectors.toList());

우선 repository로 Entity에 접근해 List를 불러왔고 그 부분을 stream.map()을 사용해 dto로 변환하고 리스트로 만들어줬다.

postman으로 테스트 해보니 비밀번호 없는 responseDto에 의해 비밀번호는 출력되지 않았다.

💡 다른 방법(@JsonIgnore 사용)

혹시 다른 방법이 더 있을까 검색해보니 @JsonIgnore을 사용하는 방법을 찾았다.
dto로 변환해주는 방법 말고 Entity에 반환하고 싶지 않은 필드 위에 @JsonIgnore을 사용하면 Json값으로 응답 받을 때 해당 필드의 값은 출력되지 않는다!

두 방법 다 결과는 잘 나왔지만 이번에는 dto 변환 방법을 사용했다. @JsonIgnore에 경우 한 줄만 추가해주면 원하는 결과를 얻을 수 있었다. 하지만 Json으로 반환할 때 값을 무시하고 출력해주기 때문에 비밀번호 같은 민감한 필드는 서비스에 로직에서 이 값을 제외하는 게 더 안전하지 않을까 라는 생각이 들었다. 이 부분은 혼자 생각한 부분이라 후에 더 공부를 하고 자세하게 알아봐야겠다.


Entity->Dto 변환 방법 참고
@JsonIgnore 사용 참고

0개의 댓글