[MSA] User-service 기능 추가

jineey·2024년 11월 8일

MSA

목록 보기
14/36

User-service

User-service 기능 추가

  • 전체 사용자 조회
  • 사용자 정보 조회

📌 Spring Cloud Gateway 연동

  • UserController.java 수정
@GetMapping("/health_check")
public String status(){
	 return String.format("It's Working in User Service on PORT %s", 
							env.getProperty("local.server.port"));
                            //메서드 return값 내용 수정
}
  • API Gateway serviceapplication.yml 수정
spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: e-user-service
          uri: lb://E-USER-SERVICE
          predicates:
            - Path=/e-user-service/**
  • 실행결과

💡 실행 시 오류 발생
다음과 같은 오류 발생 시, 해당 부분을 주석 처리하면 해결 됨
user-serviceWebSecurity.java 파일 수정

@Bean
   protected SecurityFilterChain configure(HttpSecurity http) throws Exception {
   ...
   //"hasIpAddress('localhost') or " << localhost 부분 주석 처리
     "hasIpAddress('127.0.0.1') or hasIpAddress('192.168.0.100')"))
      .anyRequest().authenticated())
      .authenticationManager(authenticationManager)
      .sessionManagement((session) -> session
    ...        
       return http.build();
   }

📌 API Gateway를 통해 호출

  • 실행결과

💡 실행 시 오류 발생

  • user-service의 URI와 API Gateway의 URI가 서로 다르기 때문임
  • 호출 순서
    (1) Client의 IP:8000/e-user-service/health_check 요청
    (2) API Gateway의 route 정보에 해당하는 /e-user-service/ 주소가 있는지 확인 후 있으면 설정 정보에 저장된 URI 주소로 이동
    (3) /e-user-service/health_check에 해당하는 엔드 포인트로 이동
    ➡ 해당 Controller에는 엔드 포인트 주소가 /health_check로 등록 되어있어서 주소가 다르기 때문에 접속이 안됨
  • 해결방법 ➡ Controller의 Mapping 정보 변경
@RestController
@RequestMapping("/e-user-service/") //추가
public class UserController { 
	... 
}
  • 실행결과

📌 전체 사용자 조회

  • ResponseOrder.java 클래스 생성
package com.example.euserservice.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 crateAt;
    
    private String orderId;
}
  • ResponseUser.java 클래스 생성
package com.example.euserservice.vo;

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

import java.util.List;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL) //NULL값은 반환하지 않음 설정
public class ResponseUser{
    private String email;
    private String name;
    private String userId;

    private List<ResponseOrder> orders;
}
  • UserDto.java 수정
package com.example.euserservice.dto;

import com.example.euserservice.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.java 수정
package com.example.euserservice.service;

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

public interface UserService {
    UserDto crateUser(UserDto userDto);
    UserDto getUserByUserId(String userId);
    Iterable<UserEntity> getUsersByAll();
    //데이터를 가공하지 않고 그대로 사용할 것이기 때문에 UserEntity 사용
}

Iterable<T>
Collection의 상위 인터페이스
iterator() 메서드를 하위 클래스에서 무조건 구현하게 만들기 위한 역할

public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();

🔗 출처: [Java] Iterable 과 Iterator 이란?

  • UserRepository.java 수정
package com.example.euserservice.jpa;

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<UserEntity, Long> {

    UserEntity findByUserId(String userId);
}
  • UserServiceImpl.java 수정
 @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> getUsersByAll() {
        return userRepository.findAll(); //기본제공되는 메서드, 조건없이 모든 데이터 반환
    }

Tip!
Ctrl+O 누르면 @Override 자동 선언

  • UserController.java 수정
@GetMapping("/users")
    public ResponseEntity<List<ResponseUser>> getUsers(){
        Iterable<UserEntity> userList = userService.getUsersByAll();

        List<ResponseUser> result = new ArrayList<>();
        userList.forEach(v -> {
            result.add(new ModelMapper().map(v, ResponseUser.class));
        });
        return ResponseEntity.status(HttpStatus.OK).body(result);
    }
  • 실행결과
    (1) 유저 등록
    (2) 실행결과

📌 사용자 정보 조회

  • UserController.java 수정
@GetMapping("/users/{userId}")
public ResponseEntity<ResponseUser> getUser(@PathVariable("userId") String userId){
			 UserDto userDto = userService.getUserByUserId(userId);
				ResponseUser returnValue = new ModelMapper().map(userDto, ResponseUser.class);
        return ResponseEntity.status(HttpStatus.OK).body(returnValue);
}
  • 실행결과
    (1) 현재 등록된 사용자 정보 확인

    (2) 사용자 조회 결과
profile
새싹 개발자

0개의 댓글