springboot 82

Spring boot docker image로 배포시 타임존 설정 방법

docker-compose.yml 설정 environment: TZ:Asia/Seoul 해당 설정 추가 Spring boot TZ 설정 java -jar -Duser.timezone=Asia/Seoul app.jar -Duser.timezone=Asia/Seoul 설정 추가 @PostContruct 어노테이션을 사용한 타임존 지정 @SpringBootApplication public class TimeZoneApplication { @PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul")); } public static void main(String[] args) { application.run(TimeZo..

Springboot 2023.08.16

Thread starvation or clock leap detected, Dead Lock, hikari 오류 해결

CPU에 우리 스프링 프로젝트의 Thread들이 올라가서 작업을 하게 되고, 그러다 한 Thread내의 별도 Transaction에서 추가적인 SQL문 실행이 필요해지면서Thread가 Connection을 더 필요로 하는 상황이 생겼다. 우리 스프링 부트 프로젝트에서 Thread가 Connection이 더 필요한 이유는 다음과 같다. 예시 상황 트랜잭션 로그를 확인해보면 Connection이 몇개가 필요한지 계산해 볼 수 있다. 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 사용한다고 한다. Service의 메소드가 사용될 때 Service의 트랜잭션이 시작하고, Service의 메소드에서 Repository를 사용할 때 Repository의 트랜잭션이 시작했다. 요청을 처리하는 한 개의 Th..

Springboot 2023.08.16

JPA /save , saveAll 사용시 주의 사항들

JPA saveALl 에서 insert 이전에 select 가 일어난다!! 부제 saveAll 을 잘 모르고 사용하는 문제 한 번에 많은 데이터를 데이터베이스에 저장하려고 할 때 일반적으로 데이터 하나당 insert를 날리는 것보다 값들을 묶어서 batch insert하는 경우가 더 성능이 좋다. 그래서 흔히 사용하는 방법이 SaveAll을 사용하는데 해당 함수의 내부를 잘 모르고 사용하면 insert 쿼리 하나당 select 쿼리가 날라가거나 아니면 bulk_insert를 의도했지만 개별로 insert 쿼리가 날라가고 혹은 의도치 않게 update가 되는 경험을 할 수 있다. Batch Insert batch insert 를 하기위한 사전 설정 yml spring: jpa: properties: hib..

Springboot 2023.08.16

Data Source 이해

커넥션을 얻는 방법은 JDBC 드라이버 매니저를 통해 획득하던지 커넥션 풀로 접근하는 두가지 방법이 있다. 드라이버 메니저를 통해 커넥션을 획득하다가 커넥션 풀로 변경시 문제 전반적인 코드 변경이 일어난다. 위 문제를 해결하기위해서 추상화를 해놨는데 DaraSource를 통해 커넥션을 획득하는 방법을 추상화 해놓은 인터페이스가 있다. 대부분의 커넥션 풀은 DataSoure 인터페이스를 이미 구현해 두었다. 스프링은 DriverManagerDataSorce 라는 DataSoure의 구현체가 있다. 그렇기때문에 DriverManagerDataSorce맞춰서 커넥션 풀을 사용할 수 있음 driverManager와 DataSoure의 차이 driverManager는 커넥션할때마다 url,username,pass..

Springboot 2023.08.16

DB 커넥션풀

커넥션풀 db가 커넥션을 할때의 과정 애플리케이션 로직이 db드라이버를 통해 커넥션을 조회한다. db드라이버는 db와 tcp/ip 커넥션 연결을 한다. db 드라이버는 id,pw와 기타 부가 정보를 db에 전달한다. db는 id,pw를 통해 내부인증을 완료해고 내부에 db 세션을 생성한다. db는 커넥션이 생성이 완료되었다는 응답을 보낸다. db드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. 위와같은 과정을거치기때문에 생각보다 복잡한 과정과 많은 시간이 소모 되는 일이다. 데이터베이스마다 커넥션 시간은 다 다르다. 위 와같은 문제를 해결하기 위해 생긴 방법이 커넥션 풀이다. 커넥션 풀 이해 커넥션풀은 커넥션을 미리 생성해두고 사용하는 방법이다. 보통 기본 커넥션 값은 보통 10개이다. 미리 10..

Springboot 2023.08.16

Springboot DataJPA 선택적으로 수정하기

선택적으로 수정하기?? 프로그램을 작성하다보면 이런경우가 있다. dto로 작성된 필드가 있을수도 있고 없을수도 있는 상황에서 해당필드값들을 선택적으로 업데이트하고 만약에 값이 들어와 있지 않다면 그대로 값을 두는것이다. 하지만 스프링에서 기존에 기본형태로 업데이트를 하는 방법은 Entity 객체에 값을 다 넣은다음 save함수에 Entity객체를 인자값으로 넣어주거나 아니면 그냥 리턴해서 더티체킹을 하는 방법이 있는데 이 두가지 방법은 위의 경우에서 적합하지 않다 왜냐하면 값이 들어오지 않는다면 null이 업데이트가 되기때문... 이럴때 사용하는것이 Optional 클래스를 활용하는 방법이 있다. 예시 public Optional updateItem(Integer id, TodoUpdateItemDTO ..

Springboot 2023.08.14

Spring boot-Cache Control Headers 하는법

Cache Control Headers 요청 데이터가 무겁지만 변경이 잘 없는 데이터는 Headers에 케시컨트롤을 통해서 사용자와 서버가 서로 윈윈할수 있는 방법이 있다. 한번 최초 요청시에 request 요청이 캐싱돼서 이후 제요청시에는 http 통신을 하지 않고 클라이언트쪽에서 바로 캐싱돼서 데이터를 띄운다. spring boot Cache Control Headers 굉장히 간단하다. 캐싱하고 싶은 컨트롤러에서 header 설정을 해주면된다. maxAge 는 캐싱되는 최대 시간이다. 이 내에 요청이 오면 캐싱 돼서 http요청없이 서비스를 진행한다. docs https://www.baeldung.com/spring-security-cache-control-headers

Springboot 2023.08.14

JPA 복합키 작성기초

대표 PK를 사용하는 게 유리할 때 클라이언트 쪽에서 복합키의 정보를 모두 알지 않아도 간편하게 리소스 관리가 가능함 (ex: 책ID, 사용자ID) 데이터를 식별할 수 있는 컬럼의 조합이 유니크하지 않을 때 (ex: 이름+저자+출판사로는 책 식별 불가할 수 있음. 동일한 명칭의 개정판이 나오기 때문) 식별가능한 복합키의 값이 변경 가능할 때 (책 이름, 저자의 필명, 출판사는 언제든 변경 가능함) 주의할 점* 인덱스가 기본적으로 하나 추가됨 (대표PK + 복합컬럼 인덱스) 복합키를 사용하는 경우 특정 데이터를 식별하는 게 의미가 없는 도메인 (ex: 걸음기록과 같은 통계성 데이터) 사용 예) 걸음기록 저장 조회 : 사용자별 최근 일주일간 평균 걸음 수 위와같은 통계성, 기록성 데이터는 id가 존재하더라도..

Springboot 2023.08.14

Springboot JUnit and Mockito

Junit Junit 이란? java 진영의 대표적인 test Framework 단위 테스트를 위한 도구를 제공 단위 테스트란? 코드의 특정 모듈이 의도된 대로 동작하는지 테스트 하는 절차를 의미 모든 함수와 메소드에 대한 각가의 테스트 케이스를 작성하는것 어노테이션을 기반으로 테스트를 지원 단정문으로 테스트 케이스의 기대값에 대해 수행 결과를 확인할 수 있음 Spring boot 2.2.버전부터 junit5 버전을 사용 Junit 5는 크게 Jupiter,Platfrom,Vintage 모듈로 구성 모듈 설명 Junit Jupiter TestEngine api 구현체로 Junit 5를 구현하고 있다. 테스트의 실제 구현체는 별도 모듈 역할을 수행하는데, 그 모듈 중 하나가 jupiter-engine 이다..

Springboot 2023.08.14