Elastic Beanstalk을 사용한 배포

JeongMin·2023년 5월 24일
0

📄요구 사항

✔ 1. 환경 변수를 분리해라.

  • 로컬 환경, 배포 환경 2가지로 환경 변수를 분리해라.
  • Spring Boot에서는 application.yml(또는 application.properties)를 활용해라.
  • 운영 환경을 로컬, 배포 환경 두가지로 나누었다.

✔ 2. CORS를 설정해라.

WebConig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/boards")
                .allowedOrigins("http://localhost:8080")
                .allowedMethods("GET", "POST", "DELETE", "PATCH")
                .allowCredentials(true);
    }
}

✔ 3. 예상치 못한 에러에 대해, 상태 코드 500과 에러 메시지로 응답하는 전역 예외 처리 설정을 해줘라.

InternalServerException

public class InternalServerException extends RuntimeException{

    static final String MESSAGE = "서버에 예상하지 못한 오류가 발생했습니다.";

    public InternalServerException() {
        super(MESSAGE);
    }
}

PostExControllerAdvice

@RestControllerAdvice
public class PostExControllerAdvice {

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<ErrorResult> badRequestExHandle(BadRequestException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(new ErrorResult(e.getMessage(), HttpStatus.BAD_REQUEST.value()));
    }

    @ExceptionHandler(NotFoundException.class)
    public ResponseEntity<ErrorResult> notFoundExHandle(NotFoundException e) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .body(new ErrorResult(e.getMessage(), HttpStatus.NOT_FOUND.value()));
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResult> methodArgumentExHandle(MethodArgumentNotValidException e){
        String errorMessage = e.getFieldError().getDefaultMessage();

        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(new ErrorResult(errorMessage, HttpStatus.BAD_REQUEST.value()));
    }

    @ExceptionHandler(InternalServerException.class)
    public ResponseEntity<ErrorResult> unexpectedExHandle(InternalServerException e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(new ErrorResult(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value()));
    }

}
  • @RestControllerAdvice 를 활용하여 에러를 따로 관리할 수 있는 Controller를 생성한다.
  • @ExceptionHandler(InternalServerException.class) 를 통해서 InternalServerException에 대한 에러를 따로 처리할 수 있다.
  • unexpectedExHandle 메서드를 생성하여 오류 메시지와 상태 코드로 응답할 수 있게 한다.

✔ 4. AWS의 Elastic Beanstalk를 활용해서 서비스를 배포해라.

  • 모든 환경 설정이 끝나고 배포까지 완료되면 해당 문구가 뜬다.

  • 해당 도메인에 들어가서 정상적으로 게시글이 작성되는지 확인했다.

  • 참고 자료 - https://www.youtube.com/watch?v=Tbf7F42tcBw

  • 처음 Elastic Beanstalk를 통해 배포를 하게 될 경우, aws-elasticbeanstalk-ec2-role 가 존재하지 않는다는 메시지를 받는다. 이 문제를 해결하기 위해 IAM에서 규칙들 중AWSElasticBeanstalkWebTier, AWSElasticBeanstalkWorkerTier, AWSElasticBeanstalkMulticontainerDocker 정책 추가를 하여 Amazon EC2를 신뢰할 수 있는 엔터티로 지정해야 한다.


📒 나의 생각

  • 프론트와 협업 경험이 없어 CORS문제에 대해서 고민해 본적이 없었지만, 이번 기회에 자세히 알아보는 기회가 생겨서 좋았다. 또한, 배포도 처음 경험해서 많이 막혔지만 검색을 하다보면 나와 비슷한 오류를 가졌던 사람들에게 힌트를 얻을 수 있었다.
  • 커스텀 예외 처리 클래스를 발생 할 수 있는 상태 코드별로 나누어 보니 내가 원하는 응답값을 내보낼 수 있어서 사용하기 좋은 것 같다.

0개의 댓글