본문 바로가기

Spring Boot

hikariCP 커넥션 누수 탐지 및 QueryDsl의 transform 커넥션 누수 이슈 해결 문제 발견 개발을 진행하던 도중 간헐적으로 아래와 같은 타임아웃 오류가 발생하며 서버가 먹통이 되는 경우 발생함 hikari-pool-1 – Connection is not available, request timed out 원인 분석 사용가능한 커넥션이 없는 것으로 보이는데 현재 커넥션풀 사이즈를 20으로 세팅하였고, 커넥션이 모자라서 데드락이 걸릴 상황도 아님 우선 실제로 커넥션풀의 20개 커넥션이 모두 사용되는지 확인하기 위해 hikari 로그 출력 설정을 추가함 logging: level: com.zaxxer.hikari.HikariConfig: DEBUG com.zaxxer.hikari: TRACE 추가 후 실행하여 사이트 여기저기 돌아다니다 보니 아래와 같이 커넥션 풀의 idle 커넥션이 0으..
[Spring Boot] Optional의 orElse(), orElseGet() 알고 쓰기 Optional은 null-safe 한 코드를 작성할 때 주로 이용됩니다. 데이터를 받아왔을 때 null 일 경우 orElse(), orElseGet()을 사용해 처리를 하는데 둘에 작지만 큰 차이점이 있으니 꼭 알고 써야 합니다. isPresent() - get() 형식도 있지만 가시성 좋고 간결한 코드를 사용합시다. 요약 1. orElse()는 Optional의 값과 상관없이 항상 메소드를 실행한다. 2. orElseGet() 은 Optional이 null 일 때 메소드가 실행된다. orElse() vs orElseGet() public T orElse(T other) { return value != null ? value : other; } public T orElseGet(Supplier
[Spring Boot] WebSecurityConfigurerAdapter Deprecated 대처 스프링 시큐리티 5.7 부터 WebSecurityConfigurerAdapter가 Deprecated 되었습니다. 기존 @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); } } 변경 (필터체인 빈 등록) @Configuration public class SecurityConfigura..
[튜토리얼] IntelliJ로 CRUD 구현하기 헬로월드가 실습생이 프레임워크를 알고있는지 체크하는 항목이였다면, CRUD는 프레임워크를 정말 쓸줄 아는지 확인할 수 있는 방법이라고 생각합니다. 기본적인 프로젝트 세팅은 앞선 글 (https://userinsight.tistory.com/19)을 참고해주세요. org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 pom.xml에 의존성을 추가해줍니다. (간단한 구현을 위해 h2 데이터베이스를 사용합니다) package com.example.springboottutorial; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax...
[튜토리얼] IntelliJ로 Hello World 찍기 저희 회사는 매년 현장 실습생들이 거쳐갑니다. Spring Boot 경험 여부를 묻기 위해 가장 먼저 하는 질문은 "헬로월드 찍을줄 아니?" 저 역시도 QA일을 하다가, 개발자 이직을 준비할때 가장 먼저 찾아보았던 것이 Hello World 였습니다. IntelliJ에서 좋은 예제를 제공하고 있는데, 이를 모르고 블로그를 참고했던 기억이 있습니다. 저희 회사에 오는 현장 실습생이나, 개발을 처음 시작하시는 분들에게 도움이 되었으면 좋겠습니다. 위 사진처럼 이름, 그룹, 아티팩트, 패키지명 등을 설정해줍니다. JDK가 설치되어 있지 않다면 IntelliJ를 통해서 설치할 수 있습니다. Spring MVC를 사용하기 위해 Spring Web을 선택해줍니다. package com.example.springbo..
[아이디어] 복합키(Composite-key), 쉽게 CRUD 해보자 데이터베이스 설계를 하다 보면 복합키(Composite-key)를 활용해야 하는 경우를 피할 수 없을 때도 있다. 만약 우리가 사용자에게 CRUD를 제공하는 웹 서비스를 개발한다면 이 복합키를 어떻게 처리해야 할 지 분명 고민에 빠질 것이다. 이 포스트에서는 AS-IS와 TO-BE 예제를 통해 Converter를 이용해 복합키를 지닌 엔티티의 CRUD를 매우 간편하게 처리할 수 있는 아이디어를 다룬다. 복합키를 가진 엔티티 정의 우선 AS-IS와 TO-BE를 설명하기 전에 복합키를 가진 엔티티를 정의해 보자 우선 Room.class 라는 엔티티를 정의하였다. 이 Room은 학년-반으로 이루어진 복합키를 가진다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2..
[Jackson] 순환참조 해결방법 시간표 관리 시스템을 개발하면서 피할 수 없는 Json 순환참조(Circular Reference) 문제가 발생하였다. 즉 직렬화를 하면무한 루프에 빠지게 되는 것. 문제점 과목(Subject)와 강의실(Room)은 다대 다(ManyToMany)관계를 갖는데, 서로 참조 관계에 있기 때문에 StackOverflowError가 발생 일반적인 해결책 일반적으로 @JsonIgnore를 이용해 해당 필드의 직렬화를 막거나, @JsonManagedReference - @JsonBackReference 쌍을 이용해 단방향으로만 직렬화가 가능하게 한다. 또 문제 하지만 우리는 조금 더 특별한 해결책이 필요하다. 순환참조 없이 양방향 직렬화가 필요하기 때문 즉 Subject 하뒤에도 Room 이 필요, Room 하위에..
[JPA] 빈 문자열을 null로 저장하는 converter 만들기 JPA를 사용하여 웹 서비스를 개발하다보면 Form 전송을 해야 하는 경우가 많이 발생하는데 문자열을 담는 필드를 전송하다보면 의도치않게 null값이 아닌 empty-string이 삽입되는 경우가 발생한다. 따라서 빈 문자열이 데이터베이스에 저장될 때 null로 변환해주는 converter를 만들어 필드에 적용한다. EmptyStringToNullConverter.java @Converter public class EmptyStringToNullConverter implements AttributeConverter { @Override public String convertToDatabaseColumn(String string) { return StringUtils.trimToNull(string); }..