웹 개발/Spring Framework
-
[Kotest, Mockk, JUnit] 테스트 중 자주하는 착각 모음웹 개발/Spring Framework 2024. 3. 12. 00:27
업무 중에 테스트 코드를 작성하다가 착각해서 잘못 사용해뒀던 것들을 정리하기. 알아두면 테스트 코드 작성하다 왜 안되지? 왜 이상하지하는 시간을 줄여줄 것이다! 별거 아닌 것처럼 보이는지만 원인을 알아채는데도 시간을 꽤 썼다. 1. Mockk 사용 시, Mocking 하지 않았는데, Mock 함수를 호출한다.실제 인스턴스를 생성하더라도 mockk 기능을 쓰면 해당 객체의 함수 리턴 결과를 조작할 수 있을거라 생각하지만 그렇지 않다. mock 처리된 객체만 mockk 기능이 동작한다. 착각하는 예시// 클래스 class Confusion { fun getHello(language: String): String { return when(language) { "kr" -> "안녕" else -> "Hello"..
-
[Spring boot + JPA] Hibernate 성능 분석을 위한 로깅하기웹 개발/Spring Framework 2023. 12. 28. 17:43
1. 하이버네이트 세션 관련해서 걸린 시간들을 통계내기 * 주의: 성능 이슈를 유발하므로 운영환경에선 쓰지말자. // application.yaml spring.jpa.properties.hibernate.generate_statistics=true // logback.xml 2. 슬로우 쿼리 찾기 필요한 경우, 운영환경에 적용해서 모니터링 해보자. // application.yaml spring.jpa.properties.hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS=1 // logback.xml (스크린샷 내용하고 다름)아래처럼 찍힌다 2021-08-15 10:54:52.397 INFO 31972 --- [ main] org.hibernate.SQ..
-
[트러블 슈팅] Spring 3.1 이상, Hibernate(JPA) 사용시 발생할 수 있는 이슈 및 내부동작 파헤치기웹 개발/Spring Framework 2023. 11. 24. 01:11
하이버네이트 6.2 마이그레이션 가이드 https://docs.jboss.org/hibernate/orm/6.2/migration-guide/migration-guide.html#ddl-changes 문제 상황 스프링 부트 3.0 → 3.1 버전업을 하면서 하이버네이트도 덩달아 6.1 → 6.2로 업그레이드 되었다. 이 영향으로 timezone을 다루는 date 타입이 DB에 저장될 때 의도와는 다른 시간으로 저장될 수 있다. 각자 상황에 따라서 의도된대로 잘 동작할 수 있다. (별 다른 설정이 없으면 하이버네이트에서 시간 변환을 UTC로 강제하기 때문에 DB의 타임존이 UTC로 쓰고 있으면 문제가 없을 수 있다 또는 MySQL 이외에 타임존을 지원해주는 DBMS 사용하면 UTC를 강제하진 않는다) 결론..
-
[Spring Batch] 이제 LocalDate도 지원돼요!웹 개발/Spring Framework 2023. 9. 2. 16:50
많은 블로그를 보면 스프링 배치에서 LocalDateTime, LocalDate, LocalTime 등이 jobParameters로 지원되지 않아서 String을 파싱하는 방법으로 알려준다. 이전에는 java 8의 time api를 지원하지 않아서 String을 파싱하는 방법 밖에 없었다. 그 이후로 최신 글이 없다보니 지금의 개발자들도 String으로 파싱해서 사용하고 있지 않을까해서 포스팅 하기. 스프링 배치에서 java 8의 time api를 2022년 10월부터 지원하고 있다. 참고글 : https://github.com/spring-projects/spring-batch/issues/1035 테스트 해봅시다. 준비물 - 버전: 스프링 배치 5.0.0 이상, 스프링 부트 배치 3.0 이상(아직까지..
-
KeyspaceEventMessageListener 이용 시, RedisCommandExecutionException: ERR unknown command 'CONFIG', with args beginning with: 'GET' 'notify-keyspace-events' 에러 해결웹 개발/Spring Framework 2023. 6. 18. 02:48
기존에 사용하던 레디스를 deprecated 시키고, 사내 인프라 도구를 이용해 새로 레디스를 만들었다. 그랬더니 기존에 없던 에러가 발생했는데, 아래의 에러가 발생했다. RedisCommandExecutionException: ERR unknown command 'CONFIG', with args beginning with: 'GET' 'notify-keyspace-events' 근본적인 원인은 레디스 서버에서 CONFIG 명령어를 허용하지 않아서 클라이언트측에서 발생하는 에러다. 클라이언트측이라 함은 결국 내가 운영하는 서버. spring data redis에서 Redis keyspace notifications 기능을 사용한다치면 서버가 올라올 때 자동으로 redis에다가 CONFIG 명령어를 날린..
-
[Redisson] SearchDomainUnknownHostException 이슈 해결웹 개발/Spring Framework 2023. 6. 18. 02:30
이건 무지성 해결 방법 공유이다.Failed to resolve '{레디스 호스트}' [A(1)] and search domain query for configured domains failed as well: [여러 도메인들] Spring에서 Redisson을 쓰고 있는데 이런 에러가 계속 발생했다. 구글링을 해보니 아래 방법으로 해결할 수 있다고한다. import io.netty.channel.socket.DatagramChannel; import io.netty.channel.socket.nio.NioDatagramChannel; import io.netty.resolver.ResolvedAddressTypes; import io.netty.resolver.dns.DnsAddressResolverG..
-
[Spring, JPA] kotlin에서 JpaRepository default method 사용하기웹 개발/Spring Framework 2022. 4. 11. 00:34
JpaRepository를 상속받은 인터페이스에서 default method를 활용할 수 있는데, 그 방법에 대한 포스팅이 많이 보이지 않아 정리해본다. JpaRepository를 상속받은 interface에서 아무렇지 않게 디폴트 메서드를 구현해서 서비스에서 호출을 하면 jpa에서 쿼리 생성을 못했다는 에러메시지가 나온다. jpa를 이미 사용하고 있는 사람이라면 query creation을 알고 있을 것이다. 바디가 없는 메서드에 한하여 메서드명을 바탕으로 쿼리를 생성해내는 jpa의 편리한 기능이다. 이 포스팅의 제목처럼 우리는 기본적인 조회처리나 조회 후 데이터 자체의 유무에 대한 exception 처리를 굳이 서비스 로직에서 처리하고 싶지 않다. interface인 repository에서 defau..
-
[Spring] Kotlin + Retrofit으로 SOAP 통신하기웹 개발/Spring Framework 2020. 10. 10. 16:05
SOAP(Simple Object Access Protocol)로 통신하는 방식은 최근에는 찾아보기 힘들다. 그래서 그런지 외부와 통신해야하는 업체가 SOAP로 통신을 주고 받아야하는 조건과 우리 서비스에서 사용하는 http 클라이언트 라이브러리인 Retrofit을 사용해야 하는 조건을 모두 만족시켜주는 시원한 해결방법이 없었다. 여기저기의 정보를 조합해서 통신하는데 성공했는데 그 방법을 정리하려 한다. Retrofit에서 XML 통신을 위해 JAXB converter 라이브러리를 제공한다. Retrofit으로 XML 통신을 하는 방법은 이 글을 참고하면 된다. 하지만, SOAP 통신을 할 때 namespace에 prefix를 부여하기도 할텐데 Retrofit에서 제공하는 JAXB converter 라이..