본문 바로가기
Study/Spring

회원 조회 기능 | Spring Spring boot JPA Study

by M개발자 2022. 2. 8.
반응형

✔ Java 11

✔ Gradle 7

✔ Spring boot 2.6.3

1. 회원 전체 조회 기능 구현

1. UserResponseDto 구현

회원 조회 시 entity를 반환하지 않고 dto를 반환하기 위해 response dto를 작성했다.

@Getter
public class UserResponseDto {
    private long id;
    private String user_id;
    private String user_password;
    private String user_name;

    public static UserResponseDto of(UserMinj userMinj) {
        UserResponseDto userResponseDto = new UserResponseDto();
        userResponseDto.id = userMinj.getId();
        userResponseDto.user_id = userMinj.getUser_id();
        userResponseDto.user_password = userMinj.getUser_password();
        userResponseDto.user_name = userMinj.getUser_name();
        return userResponseDto;
    }
}

참고 글

https://velog.io/@aidenshin/DTO에-관한-고찰

https://velog.io/@suhongkim98/요청과-응답으로-Entity-대신-DTO를-사용하자

2. Controller

@GetMapping()
public List<UserResponseDto> selectUser(){
    return userService.selectUser();
}

회원 전체 목록을 조회하므로 get 메소드를 사용하였다.

그리고 반환형은 UserResponseDto의 리스트 형태이다.

3. Service - selectUser

단순히 entity를 찾는다면 findAll() 메소드를 사용하여 반환하면 되지만 entity가 아닌 dto로 매핑한다는 과정에서 막혔다.

우선 스프링을 제대로 공부하고 시작한 것이 아닌 무작정 개발해보자로 시작하여 기본적인 지식이 없다. 그래서 entity를 반환형으로 사용해도 되는지를 찾아보았다.

https://velog.io/@suhongkim98/요청과-응답으로-Entity-대신-DTO를-사용하자

우선 이 글을 읽게된 후 dto를 사용하자고 확답이 나왔다. entity를 반환값으로 사용할 경우 순환 참조가 일어나 무한 루프에 빠질 수 있다는 문제점이 있고, 근본적으론 반환값이 entity 전체를 알 필요가 없다.

그리고 of() 메소드는 왜 사용하느냐였다. 일단 실습하면서 of() 메소드를 자주 사용했다. 그래서 service에서 생성자에 값을 넣는 것보단 이게 더 편하고 먼가 멋져 보인다. 물론 of() 메소드에서 값을 집어 넣는 과정이 귀찮긴 하다.

그래서 dto of() 메소드를 사용하였고, service에서는 stream map을 사용하여 매핑했다.

@Transactional
public List<UserResponseDto> selectUser() {
    List<User> user = (List<User>) userRepository.findAll();

    return user.stream().map(UserResponseDto::of).collect(Collectors.toList());
}

먼저 repository 내장 메소드인 findAll()을 사용하여 User 엔티티를 모두 불러와 List로 저장한다.

그리고 저장된 리스트를 stream map을 사용하여 매핑하였다.

of()가 익숙하지 않다면 생성자로 집어 넣는 방법도 있다. 

@Transactional
    public List<UserResponseDto> selectUser() {
        List<User> user = (List<User>) userRepository.findAll();

        return user.stream()
                .map(
                        user -> new UserResponseDto(user.getId(), user.getUser_id(), user.getUser_password(), user.getUser_name())
                )
                .collect(Collectors.toList());

    }

실행 결과

2. 회원 상세 조회 기능 구현

1. Controller

@PostMapping("{id}")
public UserResponseDto detailsUser(@PathVariable @Valid long id) {
    return userMinjService.detailsUser(id);
}

id를 검색하여 해당 엔티티를 불러오는 것이므로 post 메소드를 사용하였다.

2. Service - detailsUser

@Transactional
public UserResponseDto detailsUser(long id) {
    UserMinj userMinj = userRepository.findById(id).orElseThrow();
    return UserResponseDto.of(userMinj);
}

먼저 repository 내장 메소드인 findById()를 사용하여 엔티티를 저장한다.

아직 예외 처리를 하지 않아 throw 부분을 채우지 못했다.

그리고 UserResponse로 매핑해준다.

실행 결과


회의록

반응형

댓글