springboot 82

Gradle 정리

Maven 과 Gradle manen xml 기반 프로젝트 의존성 관리 도구 해당 라이브러리를 사용하기 위한 다른라이브러리까지 저장소에서 다운받아 준다. 전체적인 라이프사이클 관리 도구 Maven Lifecycle Clean : 이전 빌드에서 생성된 파일들을 삭제하는 단계 Validate : 프로젝트가 올바른지 확인학고 필요한 모든 정보를 사용할 수 있는 지 확인하는 단계 Compile : 프로젝트의 소스코드를 컴파일하는 단계 Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능) Package : 실제 컴파일된 소스 코드와 리소스들을 jar등의 배포를 위한 패키지로 만드는 단계 Verify : 통합테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는..

Springboot 2023.08.17

spring data JPA에서 Pk를 UUID로 관리해 보자

UUID PK 생성 @Id @GeneratedValue(generator = "uuid2") @GenericGenerator(name="uuid2", strategy = "uuid2") @Column(columnDefinition = "BINARY(16)") private UUID id; uuid와 uuid2의 차이점은 uuid는 RFC 4122 호환안됨 -> warn로그 쌓임 BINARY(16)은 저장할 때 남는 길이는 RPAD 처리하고 저장하기때문에 예상치 못한값이 들어가고 조회할 수 없다.(필수설정) spring Data JPA를 통한 CRUD는 전부 지원해 주는것 같다. JDBCTemplate를 활용해서 batchInsert/Update 시에 UUID 사용하기 기본적으로 아이디 채번방식이 SEQU..

Springboot 2023.08.17

CSRF 보호가 작동하는 방식

CSRF 가 필요한 이유 CSRF 보호가 작동하는 방식을 잘못 이해하면 활성화 해야 하는 시나리오에서 비활성화 하거나 그 반대의 상황이 많이 발생한다. 다음과 같은 시나리오로 예를 들 수 있다. 사용자가 파일을 관리할수 있기 인증/인가를받고 애플리케이션에 로그인한 상태에서 파일을 관리하기위해 서버에 엔드포인트를 호출하고 이메일의 알 수 없는 링크를 클릭했는데 빈화면이 나오는 페이지로 리디렉션되고 자동으로 외부 페이지가 열렸다 이때 이 페이지가 서버를 호출하고 사용자 대신 작업을 실행한다(악의적인 이유로 파일을 수정/삭제한다) 이를 가능하게 하는 이유는 애플리케이션 입장에선 해당사용자는 인증/인가를 받은(로그인한) 신뢰하는 사용자 이기 때문이다. 대부분의 앱 사용자는 자신의 보안위협을 인지하지 못하기때문에..

Springboot 2023.08.17

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