728x90
Java & Spring
40

[Spring] POSTMAN에서의 알 수 없는 Forbidden(403)은 CSRF가 원인이었다

문제 Spring Security에 scrf를 추가해주고 POSTMAN에서 request를 보내면 다음과 같이 forbidden이 발생한다. 원인 파악 SecurityFilterChain에 csrf를 추가해주면 CsrfFilter라는 놈을 거치게된다. @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // ... .csrf(Customizer.withDefaults()); return http.build(); } } CsrfFilter 코드를 보면 tokenReposito..

Java & Spring 2024.01.12

JPA N + 1 문제 해결 정리 (JPQL, EntityGraph)

엔티티 정의 위의 ERD는 간단하게 Company(기업)과 Dividend(배당금)간의 연관관계를 정의한 것이다. 기업은 여러 배당금 정보를 가질 수 있으니 기업과 배당금은 OneToMany 관계를 가진다고 말할 수 있다. Spring에서는 JPA를 사용하여 각각 다음과 같이 정의한다. (설명에 불필요한 부분은 삭제함) @Entity public class Company { @Id @GeneratedValue private Long id; @Column(unique = true) private String ticker; private String name; @OneToMany(mappedBy = "company") private Set dividends = new HashSet(); } @Entity p..

Java & Spring 2024.01.11

Spring Security Filter의 순서와 동작

1. SecurityContextPersistenceFilter Spring Security는 default로 HttpSessionSecurityContextRepository 클래스를 사용하여 Security Context를 Session으로부터 가져오거나 저장한다. 만약 Session에 Security Context가 없다면 새로 만든다. SecurityContextPersistenceFilter는 HttpSessionSecurityContextRepository로부터 얻은 Security Context를 SecurityContextHolder에 저장한다. NOTE SessionCreationPolicy를 STATELESS로 설정했을 경우 Filter가 모두 한 사이클이 돌고나서 SecurityCon..

Java & Spring 2024.01.07

JPA의 자동 키 생성 전략

JPA는 데이터베이스 테이블 대체 키를 기본 키로 자동 생성하는 기능을 지원한다. 다시 말해 어떤 하나의 필드 값을 기본 키로 지정해준다. @Entity class Team { @Id @GeneratedValue private Long id; } 위와 같이 @Id와 @GeneratedValue를 추가해주면 되는데 @GeneratedValue는 다음 4가지 전략으로 나누어진다. Strategy Description AUTO (default) 자동으로 생성 전략을 결정 IDENTITY 기본키 생성을 데이터베이스에 위임 SEQUENCE 시퀀스 오브젝트를 사용하여 기본키 생성 TABLE 키 생성 전용 데이블을 만들고 이를 사용하여 기본키 생성 AUTO 생성 전략 데이터 타입이 UUID라면 UUID Generat..

Java & Spring 2024.01.05

[JPA] Entity Lifecycle과 Dirty Checking

Persist Article article = new Article(content); // Transient/New em.persist(article); // Managed(영속) Managed(영속) 상태는 Persistence Context가 관리할 수 있는 상태를 의미한다. Managed(영속)된 엔티티들은 flush가 호출되면 EntityManager가 변경을 감지하여 자동으로 update/insert 쿼리를 수행한다. Detach Managed(영속) 상태 의 엔티티가 Persistence Context에서 detach된 것을 준영속 상태라 한다. em.detach(article); article.setContent(anotherContent); Managed(영속) 상태 에서 detach 메소..

Java & Spring 2024.01.03

AOP(Aspect Oriented Programming)의 개념과 적용

여러 메소드에 동일한 코드가 반복될 때 AOP를 적용할 수 있다. 예를 들어 로깅을 메소드의 호출 전/후에 간단하게 추가할 수 있다. AOP의 기본 개념 1. Aspect (관점) 여러 클래스나 기능에 걸쳐서 있는 관심사 (e.g. @Transactional, @Cacheable) 2. Advice (조언) AOP에서 실제로 적용하는 기능(로깅, 트랜잭션, 캐시, 인증 등) 3. Join point (연결 포인트) 특정 기능이 실행될 수 있는 연결 포인트 4. Pointcut (포인트 선택 방법) Join point 중에서 해당 Aspect를 적용(수행)할 대상을 뽑을 조건식 5. Target Object Advice가 적용될 대상 객체 6. AOP Proxy 대상 객체에 Aspect를 적용하는 경우 A..

Java & Spring 2024.01.03

dataintegrityviolationexception - OneToOne 관계에서 자식 엔티티를 삭제했을 경우

Error org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FK7FUJUGL45E8HKHKIO47O2IW29: PUBLIC.ARTICLE FOREIGN KEY(ARTICLE_FILE_ID) REFERENCES PUBLIC.ARTICLE_FILE(ID) (CAST(1 AS BIGINT))"; SQL statement: delete from article_file where id=? [23503-214]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not exe..

Java & Spring 2024.01.03

Redis의 SpinLock을 사용한 동기화 문제 해결

위와 같이 A라는 계좌를 thread1이 사용하고 있을때 동시에 thread2를 사용한다고 할 때 동기화 문제가 발생한다. 구체적으로 두 thread가 동시에 실행하게되면 처음 A계좌에있는 10,000원을 가져다 사용하기 때문에 마지막에 실행을 완료한 thread의 결과가 최종 결과가 된다. 해당 동기화 문제를 해결하기 위해 Redis의 SpinLock을 사용할 수 있다. SpinLock이란 뮤텍스처럼 한 시점의 하나의 스레드에만 접근할 수 있도록 하며 접근하지 못한 다른 스레드들은 접근 할 수 있을 때까지 루프를 돌며 재시도를 하는 것이다. spring-redis Dependency 추가 implementation 'org.springframework.boot:spring-boot-starter-dat..

Java & Spring 2023.12.28

[JAVA] Singleton Pattern (싱글톤 패턴)

Singleton Pattern (싱글톤 패턴)은 특정 클래스에 대해서 객체 인스턴스가 하나만 만들어질 수 있도록 해주는 패턴이다. 대신 전역 변수를 사용하게되면 애플리케이션이 시작될 때 생성되고 사용하지 않을 경우 자원만 잡아먹는 꼴이 된다. 하지만 싱글톤 패턴은 필요할 때만 객체를 만들 수 있다. 기본 구현 public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { //인스턴스가 생성되지 않았다면 생성 if (uniqueInstance null) { uniqueInstance = new Singleton(); } return uni..

Java & Spring 2023.12.02

Check Exception vs Uncheck Exception

예외 기본 규칙 1. 예외 처리 예외를 처리하기위해 try-catch문을 사용 2. 예외 던짐 예외를 처리하지 않고 계속 던지면 main()의 경우 시스템이 종료되며 웹 애플리케이션의 경우 WAS가 예외를 처리하는데 주로 개발자가 지정한 오류 페이지를 보여준다. Check Exception 체크 예외인 Exception과 그 하위 예외는 모두 컴파일러가 체크한다. 체크 예외는 잡아서 처리하거나 밖으로 던져야한다. 그렇지 않으면 컴파일 에러가 발생한다. 예외를 처리할 수 없을 경우에는 throws 예외를 필수로 선언해주어야 한다. 장점 개발자가 실수로 예외를 누락하지 않도록 컴파일러를 통해 문제를 잡아준다. 단점 개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야한다. 모든 하위 메소드들에 선언한 ..

Java & Spring 2023.11.10
728x90