간혹 웹 인터페이스를 가진 로컬 전용 서버 애플리케이션을 만들고 싶을 때, 사용자가 서버를 시작하면 localhost 브라우저를 자동으로 실행시키고 싶을 때가 있다. (ex. Jenkins 서버 실행 시 자동으로 브라우저로 접속 됨) 스프링 부트에서는 객체 하나를 만들어서 컴포넌트로 등록하고, 해당 빈이 생성되었을 때 실행되게끔 @PostConstruct 어노테이션을 메서드에 붙혀준다. 그리고 로컬 기본 브라우저로 해당 URL에 접속하게끔 한다. System.setProperty("java.awt.headless", "false"); 이 부분을 생략하면 HeadlessException이 발생하기 때문에 넣어준다.
# 서론 Bean Validation을 사용해서 DTO의 유효성을 검증할 때 적용할 수 있는 다양한 방법들을 정리한다. # V1 - 일반적인 처리 class UserDto { @NotBlank String username; @NotBlank String password; } @PostMapping("/join") public ResponseEntity join(@Valid @RequestBody UserDto userDto, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return ResponseEntity.badRequest().body("잘못된 요청"); } // 비즈니스 로직 } @Valid는 자바에서 제공하는 어노테이션, @Va..
# 서론 multipart/form-data 로 데이터를 서버로 전송할때, 스프링에서 제공하는 객체인 Multipart 객체를 활용해야한다. 이번 글에서는 해당 객체를 다룰때 알면 좋을 법한 것들을 정리한다. # Multipart 전송 메소드 multipart/form-data 는 POST 와 PUT 만 가능하니 유의한다. # 한개, 여러개 Multipart 받기 @PostMapping("/one") fun one(@RequestParam("file") file: MultipartFile) { } @PostMapping("/more") fun more(@RequestParam("files") file: List) { } 컨트롤러단에서는 이런식으로 받아서 처리하면 된다. 여기서 file과 files는 mu..
# 서론 현재 상황은 스프링 부트 서버용 PC1 과 리액트 개발 환경 PC2 에서 서로 통신테스트를 하는 상황이다. 리액트에서 스프링 부트 서버(PC1)로 요청을 보내면 CORS 이슈가 발생하여, 리소스 접근에 제한된다. 특히나 쿠키와 같은 헤더 정보가 저장되지 않는 이슈가 생기는데, 이와 비슷한 상황시 서버사이드에서 조치해볼 내용들을 정리한다. 기본적으로 리액트 내부에서 Proxy 설정과, withCredentials 설정을 해줘야 한다. # WebMvcConfigururer 설정 // CORS 설정 override fun addCorsMappings(registry: CorsRegistry) { registry.addMapping("/**") .allowedOrigins("http://127.0.0...
# 서론 사용자 요청 JSON과, REST API 서버의 경우 Response body를 로깅하고 싶은 요구사항이 생겨서 찾아보다가 구현한 방법을 정리한다. # 사전지식 - 서블릿 Reqeust, Response는 단 한번만 읽을 수 있다 로깅을 하기 위해서는 필터나 인터셉터를 통해서 서블릿 Request, Response를 접근해서 그 content를 읽어야한다. 그런데 그냥 읽으면 컨트롤러에서 해당 요청을 처리 못 한다. (아마 예외를 맞이할 것이다.) 이는 서블릿 구조상 생기는 문제인데, 서블릿은 요청 응답 객체를 단 한번만 읽을 수 있도록 설계되어 있기 때문이다. 그래서 로깅을 위해서 Reqeust, Response 객체를 여러번 읽기 위한 Wrapper 클래스로 한번 감싸주는 작업을 수행해야 한..
신규 프로젝트를 진행하면서 기존 자바 + 스프링 부트에서 코틀린 + 스프링 부트로 프로젝트를 작성해 봤다. 이를 통해서 직접 느낀 코틀린의 장단점(매우 주관적임!!)을 기록하고 공유하고자 한다. # 장점 코틀린 언어 차원에서 얻는 장점이 매우 많다. 1. 함수 파라미터에 디폴트 값 지정가능 2. 문자열 변수 연산자 $ 의 존재 3. 널 세이프 연산자들 (?, !!, ?.let 등) 4. 람다식, 함수형 프로그래밍 적극 지원 -> 함수를 일급 객체로 사용할 수 있는 점, let, apply 등 스코프 함수의 존재, 코틀린 DSL (덤으로 인텔리제이가 람다함수를 하이라이트 해주는 기능도 너무 좋다.) 6. static은 없지만, 클래스 외부에 함수 선언 가능 (사실상 static 이 필요없다.) 7. whe..
서버에 파일이나 이미지를 업로드 하고 싶으면 Multipart/form-data 형식으로 HTTP 메시지를 작성해야한다. 다음은 몇 가지 주안점이다. Multipart/form-data 는 무조건 POST 요청으로 들어간다. 따라서 파일이나 이미지를 첨부한 update를 구현하고 싶으면 PUT 요청이 아닌 POST 요청으로 처리하자. Multipart/form-data는 @RequestBody가 아닌, @ModelAttribute로 받자. 만약, Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=--------------------------6513226..
인텔리제이에서 코틀린으로 스프링 부트 테스트코드를 작성하면, 가끔 리펙토링한 클래스의 이름이나 타입을 인식 못하는 버그가 있음을 발견했다. (Type Mismatch 버그) 코드 편집창에서는 빨간 밑줄이 안 생기는데, 그냥 인텔리제이 내부 문제인 것 같다. 구글링해도 해결방법이 안 나와서 이것저것 시도해보다가 찾은 해결방법을 공유하고자 글을 쓴다. Build - Gradle 에서 Build and run using 과 Run Tests using을 Gradle로 변경하고 진행한다. (인텔리제이로 설정되어 있으면 발생하는 오류인 것 같다.) Gradle 로 테스트를 돌리면 이렇게 종합 결과만 나오고 세세한 결과는 보기 어렵다. 그래서 Gradle로 빌드를 한 번 하고, 다시 인텔리제이로 바꿔서 테스트를 돌..