Back-end/Spring

[Spring] Spring Boot API 사용

shoney9254 2022. 11. 6. 14:41
반응형

REST API Level3을 위한 HATEOAS 설정

 

버전별 차이가 있음

스프링 2.2 이상의 버전이기 때문에, 아래와 같이 소스코드 작성했다.

@GetMapping("/users/{id}")
public EntityModel<User> retrieveUser(@PathVariable int id) { //알아서 인티저로 변경해서 사용하려면 형을 정확하게 입력해ㅝ야함
    User user = service.findOne(id);

    if (user == null) {
        throw new UserNotFoundException(String.format("ID[%s] not found",id));
    }

    // HATEOAS
    EntityModel<User> model = EntityModel.of(user);
    WebMvcLinkBuilder linkTo =linkTo(methodOn(this.getClass()).retrieveAllUsers());
    model.add(linkTo.withRel("all-users"));

    return model;
}

아래와 같이 포스트맨 결과를 받을 수 있는 것을 확인할 수 있다.

 

REST API Documentation을 위한 Swagger설정

 

0) 인강에서는 아래와 같이 설정하라고 했지만 안됨(그래서 아래에 내가 한 방법을 작성해봤다)

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.9.2</version>
</dependency>
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.9.2</version>
</dependency>

나는 아래와 같이 설정을 해야지 정상진행되었다.

1) 먼저 야믈 파일에다가 아래와 같이 설정을 해주고,

spring:
  messages:
    basename: messages

  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

 

2) pom.xml 은 아래와 같이 설정을 해야한다.

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-boot-starter</artifactId>
   <version>3.0.0</version>
</dependency>

위와 같이 설정을 하면, 또 컨피그 클래스를 하나 만들어 줘야한다.

위와 같이 스웨거컨피그 클래스를 하나 만들어주고, 아래와 같이 타이핑을 해보자.

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2);
    }

}

위와 같이 작성하면, 아래의 두개 uri가 실행되는 것을 확인할 수 있다.

스웨거 UI : http://localhost:8088/swagger-ui/index.html

스웨커 docs : http://localhost:8088/v2/api-docs

스웨거는 지금 스프링의 컨트롤러 기준으로 여러가지 정보들을 보여주게 된다.

 

아래는 스웨거 ui

아래는 스웨거 docs

스웨거 docs에 정보를 입력하고 싶으면 아래와 같이 작성하면된다.

SwaggerConfig.java

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    private static final ContactDEFAULT_CONTACT= new Contact("shoney Lee", "<http://www.naver.com>", "ddmczp@naver.com");

    private static final ApiInfoDEFAULT_API_INFO= new ApiInfo("Awesome API Title", "My User management REST API service", "1.0",
            "urn:tos",DEFAULT_CONTACT, "Apache 2.0", "<http://www.apache.org/licenses/LICENSE-2.0>", new ArrayList<>());

    private static final SetDEFUALT_PRODUCES_AND_CONSUMES= new HashSet<>(
            Arrays.asList("application/json", "application/xml")
    );

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(DEFAULT_API_INFO)
                .produces(DEFUALT_PRODUCES_AND_CONSUMES)
                .consumes(DEFUALT_PRODUCES_AND_CONSUMES);
    }

}

연락처 정보, api 기본정보 등 Docket에다가 추가해서 정보를 넣으면 스웨거 docs에 추가되는 것을 확인할 수있다.

 

User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
//@JsonFilter("UserInfo")
@ApiModel(description = "사용자 상세 정보를 위한 도메인 객체")
public class User {
    //lombok으로 프로퍼티만 만들어도 됨
    private Integer id;

    @Size(min=2, message = "Name은 2글자 이상 입력해 주세요.")
    @ApiModelProperty(notes = "사용자 이름을 입력해 주세요.")
    private String name;

    @Past //과거만 사용가능
    @ApiModelProperty(notes = "사용자 등록일을 입력해 주세요.")
    private Date joinDate;

    @ApiModelProperty(notes = "사용자 패스워드를 입력해 주세요.")
    private String password;
    @ApiModelProperty(notes = "사용자 주민번호를 입력해 주세요.")
    private String ssn;
}

@ApiModel, @ApiModelProperty 어노테이션을 사용하면 스웨거에서 설명을 볼수있게된다.

 

REST API Monitoring을 위한 Actuator설정

pom.xml 에는 아래와 같이 세팅한다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
   <version>2.6.2</version>
</dependency>

그리고, http://localhost:8088/actuator 실행하면 작동이 돼야하는데 뭔가 문제가 있어보인다. config 클래스에 아래 소스 코드를 추가해보자.

@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties,
                                                                     Environment environment) {
    List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
    Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
    allEndpoints.addAll(webEndpoints);
    allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
    allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
    String basePath = webEndpointProperties.getBasePath();
    EndpointMapping endpointMapping = new EndpointMapping(basePath);
    boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
    return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
}

private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
    return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
}

그리고 다시 http://localhost:8088/actuator 를 실행해보면, 아래와 같이 나오는 것을 확인할 수 있다.

저기에서 헬스로 들어가보면,

상태가 업으로 조회된다.

 

야믈파일에 아래와 같이 추가하게 되면 정보를 더 볼수있게된다.

management:
  endpoints:
    web:
      exposure:
        include: "*"

 

HAL Browser

http://localhost:8088/ 로 접속하면 아래와 같이 HAL Explorer가 나온다.

actuator를 입력하고 go를 누르게 되면 아래와 같이 조회된다.

그중에 metrics로 들어가보자.

어떤 항목이 있는지 찾아보면 아래와 같은 설정을 확인할 수 있다.

해당 uri로 들어가면 아래와 같이 맥스 값을 확인할 수 있다.

 

Spring Security

pom.xml에는 아래와 같이 세팅한다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

yml파일은 아래와 같이 사용자와 암호를 입력한다.

spring:
  security:
    user:
      name: shoney
      password: 1234

그리고 그냥 포스트맨에서 기존에 사용했던 서비스를 호출해보면, 401 에러 상태 코드로 나오는 것을 확인할 수 있다.

 

Authorization에서 유저와 패스워드를 입력하면 조회가 가능하다.

그런데 매번 yml 파일에 회원과 패스워드를 입력할 순 없으니 아래와 같은 과정을 한번더 거치면 된다.

SecurityConfig.java 클래스를 하나 추가하고 아래와 같이 WebSecurityConfigurerAdapter를 상속받아 사용하면된다.

@Configuration //스프링 부트가 기동하면서 설정정보를 같이 로딩함
public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws  Exception {
            auth.inMemoryAuthentication()
                    .withUser("shoney2")
                    .password("{noop}test1234") //인코딩 없이 사용할수 있도록 함
                    .roles("USER");

        }

}

 

 

반응형