티스토리 뷰

자 저번 시간에는 Gateway와 UserService를 연동하는 과정을 거쳤었는데, 이번에는 사용자 조회 기능을 

개발해보도록 할게요.  기능 구현을 위해 주요하게 살펴봐야할 클래스는 

ResponseUser.java 클래스와 ResponseOrder.jva 클래스입니다. 그럼 바로 시작하도록 하겠습니다. 

일단 UserService 프로젝트에 접근해볼게요.  가장 먼저 작성해야할 부분은 ResponseUser.java 클래스 입니다. 

 

#ResponseUser.java

package com.example.userservice.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.util.List;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseUser {
    private String email;
    private String name;
    private String userId;

    private List<ResponseOrder> orders;
}

 

@JsonInclude 어노테이션을 추가해주시고 NON_NULL 옵션을 손에 쥐어 줍니다.

그리고 List<ResponseOrder> orders 를 통해서 주문과 관련한 정보도 가져와줄건데 오류가 날거에요! 

왜냐면 ResponseOrder라는 클래스는 아직 작성하지 않았으니까요.

ResponseUser와 같은 레벨에 다음과 같이 ResponseOrder라는 클래스를 만들어 줄게요.

그리고 관련한 정보를 @Data를 통해서 선언해줄거에요 다음과 같이요! 

#ResponseOrder

package com.example.userservice.vo;

import lombok.Data;

import java.util.Date;

@Data
public class ResponseOrder {
    private String productId;
    private Integer qty;
    private Integer unitPrice;
    private Integer totalPrice;
    private Date createdAt;
    
    private String orderId;
}

 

그리고 주문과 관련한 정보를 Dto에서 요청 응답 할 수 있게 orders라는 변수를 추가해줄게요 

# UserDto

package com.example.userservice.dto;

import com.example.userservice.vo.ResponseOrder;
import lombok.Data;

import java.util.Date;
import java.util.List;

@Data
public class UserDto {

    private String email;
    private String name;
    private String pwd;
    private String userId;
    private Date createdAt;

    private String encryptedPwd;
    
    private List<ResponseOrder> orders;

}

이제 사용자 조회라는 기능에 맞게 UserService를 조금 수정해줘야겠죠? 

package com.example.userservice.service;

import com.example.userservice.dto.UserDto;
import com.example.userservice.jpa.UserEntity;


public interface UserService {
    UserDto createUser(UserDto userDto);

    UserDto getUserByUserId(String userId);
    Iterable<UserEntity> getUserByAll();
}

다음과 같이 getUserByUserId와 getUserByAll이라는 함수를 추가해줄게요. 

그 뒤에 UserServiceImpl넘어와 아직 Override되지 않은 메서드를 추가 한 뒤 약간 수정을 할거에요.

#UserServiceImpl

package com.example.userservice.serviceimpl;

import com.example.userservice.dto.UserDto;
import com.example.userservice.jpa.UserEntity;
import com.example.userservice.jpa.UserRepository;
import com.example.userservice.service.UserService;
import com.example.userservice.vo.ResponseOrder;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    UserRepository userRepository;
    BCryptPasswordEncoder passwordEncoder;
    @Autowired
    public UserServiceImpl(UserRepository userRepository,BCryptPasswordEncoder passwordEncoder){
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public UserDto createUser(UserDto userDto) {
        userDto.setUserId(UUID.randomUUID().toString());

        ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
        UserEntity userEntity = mapper.map(userDto,UserEntity.class);
        userEntity.setEncryptedPwd(passwordEncoder.encode(userDto.getPwd()));

        userRepository.save(userEntity);

        UserDto returnUserDto = mapper.map(userEntity, UserDto.class);

        return returnUserDto;
    }

    @Override
    public UserDto getUserByUserId(String userId) {
        UserEntity userEntity = userRepository.findByUserId(userId);


        if (userEntity == null )
            throw new UsernameNotFoundException("User not found");

        UserDto userDto = new ModelMapper().map(userEntity,UserDto.class);

        List<ResponseOrder> orders = new ArrayList<>();
        userDto.setOrders(orders);

        return userDto;
    }

    @Override
    public Iterable<UserEntity> getUserByAll() {
        return userRepository.findAll();
    }
}

자 여기서 바뀐 부분은 다음과 같습니다. 

   @Override
    public UserDto getUserByUserId(String userId) {
        UserEntity userEntity = userRepository.findByUserId(userId);


        if (userEntity == null )
            throw new UsernameNotFoundException("User not found");

        UserDto userDto = new ModelMapper().map(userEntity,UserDto.class);

        List<ResponseOrder> orders = new ArrayList<>();
        userDto.setOrders(orders);

        return userDto;
    }

    @Override
    public Iterable<UserEntity> getUserByAll() {
        return userRepository.findAll();
    }

getUserByAll은 저희가 기존에 만들었던 userRepository 에서 findAll이라는 함수이름으로 이미 제공이 되어있습니다.

해당 함수를 실행시키면 모든 정보를 조회하도록 되어있어요. 

다만 ID별로 조회를 위해서는 저희가 직접 메서드를 하나 만들어야해요. 

UserEntity userEntity = userRepository.findByUserId(userId); 이 부분에서 findByUserId 부분이 

저희가 직접 만들어야할 함수명이에요. 그래서 당연히 빨간색으로 출력될거에요! 그리고 Entity객체를 직접 읽긴 힘들기 떄문에 Dto를 통해서 조회결과를 담아주는 내용의 함수입니다! 저희가 할일은 단순합니다. 에러 해결을 위해서 그냥 자동생성을 통해서 userRepository안에 다음과 같이 입력할게요.

#UserRepository

package com.example.userservice.jpa;

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<UserEntity, Long> {

    UserEntity findByUserId(String userId);
}

완료가 되셨나요? 그럼 기본적인 설정은 전부 끝났어요! 이제 컨트롤러만 살짝 손보도록 할게요. 


#UserController 

package com.example.userservice.controller;

import com.example.userservice.dto.UserDto;
import com.example.userservice.jpa.UserEntity;
import com.example.userservice.service.UserService;
import com.example.userservice.vo.RequestUser;
import com.example.userservice.vo.ResponseUser;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/user-service")
public class UsersController {

    private Environment env;
    private UserService userService;
    @Autowired
    public UsersController(Environment env, UserService userService){
        this.env = env;
        this.userService = userService;
    }

    @GetMapping("/health_check")
    public String status(){
        return String.format("It's Working in User Service on PORT %s",
                env.getProperty("local.server.port"));
    }
    @GetMapping("/welcome")
    public String welcome(){
        return env.getProperty("greeting.message");
    }
    @PostMapping("/users")
    public ResponseEntity<ResponseUser> createUser(@RequestBody RequestUser user){
        ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
        UserDto userDto = mapper.map(user, UserDto.class);
        userService.createUser(userDto);

        ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);

        return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);

    }
    @GetMapping("/users")
    public ResponseEntity<List<ResponseUser>> getUsers(){
        Iterable<UserEntity> userList = userService.getUserByAll();

        List<ResponseUser> result = new ArrayList<>();
        userList.forEach(v->{
            result.add(new ModelMapper().map(v, ResponseUser.class));
        });
        return ResponseEntity.status(HttpStatus.OK).body(result);
    }
    @GetMapping("/users/{userId}")
    public ResponseEntity<ResponseUser> getUsers(@PathVariable("userId") String userId){
        UserDto userDto = userService.getUserByUserId(userId);


        ResponseUser returnValue = new ModelMapper().map(userDto, ResponseUser.class);

        return ResponseEntity.status(HttpStatus.OK).body(returnValue);
    }
}

@RequestMapping("/user-service") 를 통해서 해당 컨트롤러는 /user-service가 선행으로 붙어야 접속되도록 

먼저 맵핑을 수정해줄게요. 그리고 두개의 Mapping이 추가됐는데 둘다 GET방식이에요! 저희는 단순조회를 원하니까요

먼저 회원목록 전부 조회하는 mapping입니다. 

    @GetMapping("/users")
    public ResponseEntity<List<ResponseUser>> getUsers(){
        Iterable<UserEntity> userList = userService.getUserByAll();

        List<ResponseUser> result = new ArrayList<>();
        userList.forEach(v->{
            result.add(new ModelMapper().map(v, ResponseUser.class));
        });
        return ResponseEntity.status(HttpStatus.OK).body(result);
    }

userService에서 저희가 모든 회원을 가져오는 함수를 작성했으니 그대로 가져와 줍니다.

그냥 이대로 출력하며 좋겠지만 Entity형태는 그대로 가져 올 수가 없어서 약간 정제작업을 거쳐야합니다.

forEach문을 사용해서 userList안에 들어있는 내용을 모두 ArrayList에 담는 작업을 진행해 줍니다. 

그럼 최종적으로 저희가 읽을 수 있는 데이터형태로 출력이 될거에요!

먼저 POST방식으로 회원등록을 진행 한 뒤에 GET방식으로 바꿔서 Send를 눌러봅시다.

다음과 같이 회원정보가 출력되시나요? 그렇다면 성공입니다!

마찬가지로 회원의 ID값으로 조회하기 위해서는 아래와 같이 작성해줍니다. 

    @GetMapping("/users/{userId}")
    public ResponseEntity<ResponseUser> getUsers(@PathVariable("userId") String userId){
        UserDto userDto = userService.getUserByUserId(userId);


        ResponseUser returnValue = new ModelMapper().map(userDto, ResponseUser.class);

        return ResponseEntity.status(HttpStatus.OK).body(returnValue);
    }

/{userId} 를 통해서 URL이 id값을 받아 올 수 있도록 설정해줬어요. 

그리고 UserId를 활용해서 userDto에 해당 정보가 담기고 최종적으로 저희가 아래의 사진과 같이 

정보를 받을 수 있어요!

마찬가지로 회원가입을 진행 한 뒤에

ID로 검색 시 해당 ID와 관련된 정보를 출력!

와!! 정말 수고하셨어요. 

그럼 사용자 조회에 대한 기능은 잘 마무리 하신 거에요. 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함