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

💡 실행 시 오류 발생
다음과 같은 오류 발생 시, 해당 부분을 주석 처리하면 해결 됨
➡user-service의 WebSecurity.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(); }

💡 실행 시 오류 발생
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로 등록 되어있어서 주소가 다르기 때문에 접속이 안됨
@RestController
@RequestMapping("/e-user-service/") //추가
public class UserController {
...
}

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;
}
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;
}
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;
}
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();
package com.example.euserservice.jpa;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<UserEntity, Long> {
UserEntity findByUserId(String userId);
}
@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자동 선언
@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);
}



@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);
}

