-
JDBC Template을 이용한 회원정보 조회 기능 구현(2)Spring 2023. 2. 23. 09:01
계속해서 SNS 프로젝트를 진행해보자.
이번에는 조회 기능을 구현하도록 하겠다.
DTO
추후 JPA로 변환 했을 때, Member 객체를 controller까지 직접 사용하게 된다면 OSIV(Open Session In View)와 같은 문제가 생길 수 있다.
또한 entity가 의도치 않게 변경될 가능성이 생기고 불필요한 정보들까지 내어주게 된다.
따라서 DTO를 사용하여 위의 문제를 예방하도록 한다.
public record MemberDto( Long id, String email, String nickname, LocalDate birthday ) { }
Repository
public Optional<Member> findById(Long id) { var sql = String.format("SELECT * FROM %s WHERE id = :id", TABLE); var param = new MapSqlParameterSource() .addValue("id", id); RowMapper<Member> rowMapper = (ResultSet resultSet, int rowNum) -> Member .builder() .id(resultSet.getLong("id")) .email(resultSet.getString("email")) .nickname(resultSet.getString("nickname")) .birthDay(resultSet.getObject("birthday", LocalDate.class)) .createdAt(resultSet.getObject("createdAt", LocalDateTime.class)) .build(); var member = namedParameterJdbcTemplate.queryForObject(sql, param, rowMapper); return Optional.ofNullable(member); }
BeanPropertyRowMapper를사용하지 않고 RowMapper를 직접 구현한 이유는 Setter를 막기 위해서다.
Setter를 열어놓게 되면 어디서든 Member에 대해 수정이 일어날 수 있기 떄문에, 코드가 많아지거나 하면 side effect 측정이 힘들어진다.
따라서 웬만하면 setter를 직접 여는 것보다, 의미 있는 동작 단위로 묶어서 개발 하는 것이 좋다.
Service
@Service @RequiredArgsConstructor public class MemberReadService { private final MemberRepository memberRepository; public MemberDto getMember(Long id) { var member = memberRepository.findById(id).orElseThrow(); return toDto(member); } public MemberDto toDto(Member member) { return new MemberDto(member.getId(), member.getEmail(), member.getNickname(), member.getBirthDay()); } }
Contoller
@GetMapping("/members/{id}") public MemberDto getMember(@PathVariable Long id) { return memberReadService.getMember(id); }
테스트 결과 - 성공
'Spring' 카테고리의 다른 글
Java, Database, Synchronized 등 다양한 동시성 제어 방법 in Java (1) (0) 2023.03.21 Java 접근제한자와 entity 설계(getter/setter, lombok) (0) 2023.03.07 JDBC Template을 이용한 회원정보 변경 내역 저장 (4) (0) 2023.02.25 JDBC Template을 이용한 회원정보 변경 기능 구현(3) (0) 2023.02.24 JDBC Template을 이용한 회원정보 등록 구현 (1) (0) 2023.02.22