전체 글 410

Bucket4j 기본 개념 (Spring boot Rate Limiter

bucket4j Token Bucket알고리즘의 아이디어 위에 구현된 rate limit 라이브러리 입니다. io.github.bucket4j.Bucket 인터페이스로 표시 됩니다. Token Bucket 알고리즘은 쉽게 말해서 패킷에 토큰을 심어놨다가 요청이 들어올때마다 하나씩 줄여서 0이 되면 요청을 거부하도록 하는 알고리즘인것 같습니다. Token bucket 알고리즘 docs : https://en.wikipedia.org/wiki/Token_bucket BucketConfiguration: 작업 중에 버킷에서 사용하는 변경할 수 없는 제한 규칙 모음을 지정합니다. BucketState : 현제 사용가능한 토큰의 양과 변경가능한 상태를 버킷에 저장하는 위치 bucket은 다음과같이 빌더로 객체를 ..

Springboot 2023.08.17

Spring boot 백엔드 아키텍쳐 Infra Layer

Infra Layer? infra layer는 다른 애플리케이션이나 데이터베이스등 외부 요소와 연결을 수행합니다. 예를들어 db서버와의 연결 Message Queue(kafka, rabbitMQ), 외부 API 요청방식 정의 등이 있습니다. Infra Layer 기능 DB로의 요청/응답 처리 가장 흔히 사용되는 Jdbc라는 javaAPI가 있고 스프링 내부적으로 디비접근기술에 대한 것은 다 추상화처리를 해 놓았기때문에 개발자는 설정만 정의해서 사용하면된다. RestApI 연결 방식 구현 Spring은 api요청이 서버로 오게되면 Template라는 원칙으로 설계를 통일하여 외부 서버와 RestTemplate로 통신할 수 있게 되었습니다. 더 나아가 비동기식 호출을 원하는 경우에는 WebClient라는 객..

Springboot 2023.08.17

스프링 DB 트랜잭션

트랜잭션 이해 데이터를 저장할때 단순히 파일에 저장해도 되는데 데이터베이스에 저장하는 이유중 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다. 이것을 쉽게 풀어서 이야기하면 데이터 베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 하지만 트랜잭션을 지키기 위해서는 고려해야할 점이 많다. 데이터베이스가 제공하는 트랜잭션기능을 사용하면 1에서 3까지 순차적인 하나의 일 단위에서 2번에서 문제가 생기면 1에서 발생한 데이터도 롤백을 해주고 3까지 정상적으로 일이 끝나면 커밋을 해서 데이터를 저장을 해준다. 트랜잭션 ACID ACID 원자성 일관성 격리성 지속성 트랜잭션은 ACID를 보장한다. 원자성 : ..

Springboot 2023.08.17

spring data JPA @Modifying

@Modifying @Query 애노테이션을 사용하면서 데이터에 변경이 일어나는 INSERT, UPDATE, DELETE, DDL 에서 사용합니다. 주로 벌크 연산 시에 사용됩니다. 벌크연산을 할 때는 JPA Entity LifeCycle을 무시하고 쿼리가 실행되기 때문에 해당 애노테이션을 사용할 때는 영속성 컨텍스트 관리에 주의해야 합니다. 앞으로 설명할 clearAutomatically, flushAutomatically를 통해 간단하게 해결할 수 있습니다. clearAutomatically @Modifying이 붙은 쿼리메서드 실행 직후 영속성컨텍스트를 clear할 것인지 정한다. defult는 false 쉽게 생각해서 false로 해놓으면 다음과 같은 일이 벌어진다. A라는 엔티티를 조회 이때 영..

Springboot 2023.08.17

SpringSecurity 에서 WebSecurityConfigurerAdapter 가 deprecated됐다...

5.7버전부터 WebSecurityConfigurerAdapter 가 deprecated됐다.. 기존에 다음과같이 상속을 받아서 오버라이드하는 방식으로 구현돼 있었다. public class SecurityConfig extends WebSecurityConfigurerAdapter {} 근데 이제 springboot가 버전업이 되고 시큐리티또한 버전업이되면서 변경사항이 많이 생겼다. 이제 상속받아서 사용하는것이 아닌 bean으로 등록해서 사용한다. 바뀐 코드 @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().antMatchers("/test/"); // test 자리에 ignore 할 ur..

Springboot 2023.08.17

쿼리 매소드 fetch 조인 적용

Fetch join? 패치 조인은 영속성 관리대상인 엔티티 객체를 호출할때 해당 엔티티객체가 관계맺고 있는 대상까지 다 조회를 한다. 이때 예를 들어 아래와 같이 조회를 한다고 가정해 보자 select m from member m 위와 같은 쿼리를 jpql로 날렸을때 실제로 하이버네이트에서 보내는 쿼리는 member 내부에 관계를 맺고있는 다른 엔티티를 조회하는 쿼리까지 함께 보낸다 연관관계를 맺고 있는 엔티티까지 다 들고오는건 orm의 강점 이긴하나 이때 발생하는 문제가 바로 연관관계를 맺고 있는 엔티티의 수만큼 select 쿼리가 나가는 것이다. 그말은 즉 io가 많아진다는 것이고 때에따라선 성능저하의 원인이 될 수도 있다. 이를 해결하는 방법중 하나가 fetch 조인이다. JPQL fetch joi..

Springboot 2023.08.17

[JPA] @GeneratedValue의 Auto_increment 미적용 될때

미적용 예시 상황 a테이블과 b테이블을 각각 save를 사용해서 insert 하게되면 id값이 합쳐서 올라가는 현상이 있습니다. @GeneratedValue를 사용하면 default값으로 AUTO가 적용되고, AUTO는 IDENTITY를 기본으로 사용한다고 알고 있었는데, 실제로 적용되는 전략은 IDENTITY가 아닌것 입니다. 실제 ddl 쿼리 내용을 보면 sequence 전략이 찍혀있다 시퀀스 전략이란 시퀀스 전략은 모든 엔티디에 대한 id값을 시퀀스 테이블 하나에서 통합적으로 관리하는 전략이다 그래서 id값이 하나의 엔티티처럼 증가하는 현상이 발생한것. IDENTITY 전략을 적용하기 위해선? yml 혹은 propertice에 다음과 같은 설정을 추가해 줘야한다. spring.jpa.hibernat..

Springboot 2023.08.17

SpringBoot/java POI 이용해서 엑샐 생성하기

POI? 아파치에서 만든 java로 엑셀을 핸들링할 수 있게 해주는 라이브러리 입니다. 의존성 (gradle) implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2' implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' // .xlsx 를 사용하려면 해당 의존성을 추가해야합니다. 사용법 기본 적인 사용법은 간단합니다. 용어 workbook 하나의 엑셀파일을 의미합니다. 가장 큰 단위로 생각 하면 됩니다. sheet sheet는 말그대로 엑셀 시트를 생성해 주는 것 입니다. Sheet sheet = workbook.createSheet("시트명"); row..

Springboot 2023.08.17

MacOS RAM 사용 유형

macOS의 RAM 사용은 크게 Free, Active, Inactive, Wired 네 가지로 분류된다. Free Memory: 현재 사용되지 않고 시스템에 의해 즉시 사용될 수 있는 메모리. Active Memory: 현재 실행 중인 애플리케이션에 의해 사용되는 메모리. Inactive Memory: 이전에 사용되었지만 현재는 사용되지 않는 메모리. 필요한 경우 다른 프로세스에게 재활용될 수 있습니다. Wired Memory: 코어 시스템 프로세스와 서비스에 의해 사용되며, 다른 애플리케이션에 의해 무시되거나 재활용되지 않는 메모리. Free Memory 이 메모리는 새로운 애플리케이션이나 프로세스가 시작될때 즉시 사용된다. 일반적으로 많은 Free메모리가 있을수록 좋다 macOS는 메모리를 최소한으..

cs 2023.08.17

Spring boot Static 필드에 @Value 사용

Static 필드에 @Value 사용 Static 필드에 @Value 값은 바인딩 될 수 없습니다. 정확한 이유는 잘 모르지만 제 생각엔 java에서 가장 먼저 jvm 이 가장 먼저 메모리에 띄우는 것들이 static 인데 메모리에 이미 올라간 상태로 @Value 로 바인딩하려니 안되는 것 같습니다. 쉽게 말해 메모리에 올라가는 순서 때문에 발생한 문제인것 같습니다. ( 정확한 이유는 좀 더 공부를 해 봐야겠습니다) 해결 방법은 간단합니다. setter로 바인딩 해주면 그만입니다. @Component public class EncryptionUtil { public static String key; @Value("${enc.key}"}) public void setKey(String value) { ke..

Springboot 2023.08.16