Java Stack/Spring
spring-webmvc 4.3.x와 5.x.x의 차이 - HttpMessageNotWritableException
spring-webmvc 4.3.x와 5.x.x의 차이 - HttpMessageNotWritableException
2023.04.03상황 spring-webmvc 4에서 5로 버전업하면서 특정 컨트롤러에서 아래 에러 발생 org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class dev.umbum.MyExceptionResponse] with preset Content-Type 'application/vnd.ms-excel' @GetMapping("/excel") public MyResponse 문제의_컨트롤러(HttpServletResponse response, MyRequest request) { response.setContentType("application/vnd.ms-excel"); //
spring-webmvc 에서 SpringBoot로 단계별로 전환하기
spring-webmvc 에서 SpringBoot로 단계별로 전환하기
2023.04.01전환 사유 대부분의 가이드, docs, 자료가 SpringBoot를 전제하고 있어 mvc 프로젝트 유지보수 시 불필요하게 리소스가 낭비되는 부분이 있음. @MockBean, @SpyBean 등 SpringBoot의 TC 지원 애너테이션을 사용 할 수 없어 TC 작성 효율이 떨어지고 보일러플레이트 작성에 대한 진입장벽 높음. SpringBoot로 전환하는게 장기적으로 유지보수비용이 더 세이브 될 것 같아 전환 결정. As-is spring-webmvc 4.3.4.RELEASE 외장 tomcat maven jsp 코드 다수 폴더 기반 deploy (war 사용하지 않고 디렉터리 전체를 배포) 폴더 전체 배포는 아무래도 node_modules 같은 디렉터리는 디플로이 시 제외해야 하는 등 신경써야 하는 부분이..
[Spring] EventListener
[Spring] EventListener
2022.04.17https://www.baeldung.com/spring-events ``kt ApplicationEventPublisher::publishEvent``로 pub 하고 ``kt @EventListener``로 event 받아 처리하면 된다. 단 여기서 주의해야 할점! listener가 이벤트를 수신하는 것이 왠지 비동기로 이루어질 것 같지만, 기본적으로 동기식이다! 한 스레드가 pub한 다음, 해당 이벤트를 처리해야 하는 EventListener들을 돌면서 동기식으로 직접 리스너를 수행한다. By default, the listener is invoked synchronously. However, we can easily make it asynchronous by adding an @Async annot..
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상
2022.01.12``` oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found. ``` ```sql select * from v$resource_limit where resource_name = 'processes'; ``` 프로세스 수가 최대치에 육박하여 더 이상 요청을 처리할 수 없어 발생하는 문제. 커넥션 풀 close를 제대로 하지 않는 것으로 보임. HikariDataSource(==ConnectionPool)의 maximumPoolSize 기본값은 10인데, 이를 3으로 변경하고 수행하니 커넥션에 여유가 생겨 pendin..
[Spring] DB 관련 : Mybatis CustomTypeHandler
[Spring] DB 관련 : Mybatis CustomTypeHandler
2021.03.31jdbcType : nullable column에 null이 들어갈 때? MyBatis는 nullable 컬럼의 parameter로 null이 넘어왔을 때, jdbcType이 명시되어 있지 않으면 TypeException을 던진다. setNull로 해당 타입에 맞는 null값(VARCHAR인 경우 "")을 넣어줘야 하는데, 뭘 넣어줄지 모르니까 예외가 발생하는 것 The JDBC Type is required by JDBC for all nullable columns, if null is passed as a value. You can investigate this yourself by reading the JavaDocs for the PreparedStatement.setNull() method. [..
[Spring] WebClient
[Spring] WebClient
2021.03.14왜 WebClient ?: RestTemplate은 deprecated 예정. docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports syn..
spring-webmvc 5.2.4 이하(springboot 2.2.5 이하) 버전에서 발생하는 응답지연 현상
spring-webmvc 5.2.4 이하(springboot 2.2.5 이하) 버전에서 발생하는 응답지연 현상
2021.01.14최근 알 수 없는 이유로 운영 서버에 응답 지연 현상이 발생했었는데요, 특정 request 수신 시 spring-webmvc 5.2.4 이하 버전에서 발생하는 것으로 밝혀졌습니다. -- 응답지연 현상 분석 결과, 재현 방안, 대응책 공유 상황 11/27 보안 스캐닝 진행 중 API-A 서버에서 응답지연 발생 보안스캐닝 중지 후에도 응답지연 지속됨 재시작 후 정상화 9/8에 발생했던 API-B 서버 응답지연과 양상이 비슷함 응답지연 발생 시점 PINPOINT log 보안스캐닝 패킷이 인입된 시간은 16:26 부근 응답지연이 발생하기 시작한 시간은 16:33 api-a 재시작 16:54 보안스캐닝 패킷 일부 재현 beta api-a 테스트 beta api-a 서버에 ngrinder로 부하 주면서 보안스캐닝으..
Java Servlet 이란
Java Servlet 이란
2020.06.15Servlet이 무엇인가? A servlet is a Java programming language class used to extend the capabilities of servers that host applications accessed by means of a request-response programming model. Although servlets can respond to any type of request, they are commonly used to extend the applications hosted by web servers. For such applications, Java Servlet technology defines HTTP-specific servlet classes..
RestTemplate은 어떻게 response Object를 DataType <T>로 변환하는가
RestTemplate은 어떻게 response Object를 DataType <T>로 변환하는가
2020.03.27원래 그 데이터 타입으로는 캐스팅 가능 ```kt @Test fun `테스트`() { val obj: Object = Coffee("id", "name") as Object val coffee: Coffee = obj as Coffee // 이건 원래 그 데이터가 Coffee라서 가능 val obj2: Object = Object() val coffee2: Coffee = obj2 as Coffee // 이건 불가능. id 속성이랑 name 속성이 없으니까 당연 불가능하다 } ``` RestTemplate의 response Object -> T type casting 과정 RestTemplate도 내부적으로는 `` (T)`` 캐스팅을 이용하게 되는데 ``kt extractData()``에서 비검사 형변환..
[Spring] profile로 alpha, beta, real 빌드 구분하기
[Spring] profile로 alpha, beta, real 빌드 구분하기
2020.03.03[Spring] 외부 상수 넣어주기 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config Spring profile VS Gradle(Maven) profile Gradle(Maven) profile? 빌드 시 어떤 profile에 속하는 리소스 파일을 빌드 결과물에 포함 시킬지 말지를 결정 빌드타임 프로파일 설정 즉, Gradle(Maven) profile이 더 큰 파일 개념이고, 선택한 파일(e.g., 리소스 파일)을 jar에 포함하거나 포함하지 않거나를 결정하는데 사용함. 예를 들어 alpha/resources.yml 파일을 패키징 시 jar에 포함 할거냐 말거냐. Spr..
[Spring] Controller에서 사용하는 애너테이션
[Spring] Controller에서 사용하는 애너테이션
2019.09.25@ModelAttribute / @RequestBody 애너테이션은 웬만하면 붙여주는 편이 명확하다. @ModelAttribute를 명시하지 않아도 자동으로 URL 파라미터를 객체로 매핑해주고, GET은 관례적으로 URL 파라미터로 데이터를 전달하기 때문에, 굳이 @ModelAttribute를 사용해야 하느냐 라고 생각할 수 있는데 Controller에서 GetMapping 메서드는 사실 (URL 파라미터/HTTP 바디) 양 쪽 모두 데이터를 받을 수 있다. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Summary_table 보면, GET의 경우 Request has Body가 No가 아니라 Optional로 되어 있다. POST, PUT도 마..
Spring AOP / @annotation resolve
Spring AOP / @annotation resolve
2019.07.30AOP(Aspect Oriented Programming)는 언제 유용한가? 가끔 AOP를 쓰지 말아야 할 곳에 AOP를 쓰는 경우를 보게 된다. 어떤 기능은, 쓸 수 있다고 쓰는게 아니라, 쓰는게 효용이 있을 때 확실한 근거를 가지고 올바르게 써야한다. AOP를 쓰기 전에 이런 물음을 던져보아야 한다. '어떤 기능이 현재 클래스의 관심 밖이라면, 별도 클래스로 분리해서 호출하면 되는 것 아닌가?' class A(otherClass: Cls) { fun method(p: Param) { otherClass.doSomething(p) ... } } 맞다. 위와 같이 짤 수 있고, 어색하지 않다면 이런 코드를 굳이 AOP로 바꾸는게 별다른 이점은 없다. 하지만 AOP가 분명히 유리한 경우가 있다. 아래는 그..