728x90
분류 전체보기
521

[Spring] Equals와 HashCode를 재정의(Override)해야하는 이유

Background Java의 Class는 Equals 또는 HashCode로 서로 동일한지 판단할 수 있다. 만약 단순히 new 생성자로 Class를 생성 후 ==비교하게되면 서로 다른 주소값을 가지기때문에 두 Class는 다르다고 판단한다. 또한 Class 객체는Equals로 비교할 경우에도 주소값을 사용하여 비교한다. 그리고 hashcode는 객체의 주소값을 해싱한 값(해시 코드)이므로 아래처럼 새로운 Class를 생성하게되면 서로 다른 hashcode를 가진다. public class Dummy { private final int a; private final int b; public Dummy(int a, int b) { this.a = a; this.b = b; } } public class ..

Java & Spring 2024.01.22

[Java] static과 final은 언제 사용해야할까

먼저 JVM 메모리는 다음과 같이 이루어져있다. 여기서 Method Area에 Static 변수가 저장되며 JVM 시작시 생성된다. 그리고 GC(Garbage Collection) 대상이 아니지만 명시적으로 null 선언시 GC 대상이 된다. static은 언제 사용할까 보통 여러 인스턴스 간에 데이터를 공유해야할 때 다음과 같이 클래스 변수를 사용하거나 인스턴스에 종속되지 않는 메소드를 정의할 때 사용한다. public class Example { public static int count; public static void incrementCount() { count++; } } 그리고 내부 클래스를 정의할 때에도 static을 선언해주어야한다. 만약 아래처럼 static을 선언하지 않으면 내부 클래..

Java & Spring 2024.01.20

[JPA] 필요한 특정 필드만 조회하여 쿼리 최적화 수행

먼저 다음과 같이 ArticleFile이라는 엔티티가 있다고 해보자. @Entity public class ArticleFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long byteSize; private String fileName; private String fileExtension; @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "article_id") private Article article; ... } ArticleFile에는 id를 제외하고 byteSize, fileName, fileExtension이 ..

Java & Spring 2024.01.16

[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

예시로 이해하는 CSRF Attack

다음과 같이 어떤 은행에 1000원을 이체하는 GET 요청이 있다고 해보자. GET http://netbank.com/transfer.do?acct=PersonB&amount=1000 HTTP/1.1 한 해커는 위와 같은 요청을 수정하여 다음과 같이 자신의 계좌로 이체하도록 만들 수 있다. GET http://netbank.com/transfer.do?acct=AttackerA&amount=1000 HTTP/1.1 그리고 이렇게 수정한 링크를 하이퍼링크로 삽입하여 여러 사용자들에게 메일을 보낼 수 있게된다. Read more! 이런 메일을 받은 어떤 사람이 은행 계정에 로그인된 상태로 클릭하게되면 해커의 계좌로 이체하게 되는 것이다. POST 요청으로 이체를 수행하는 은행은 위와같이 태그를 사용할 수 없..

Network 2024.01.10

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

스레드가 많으면 좋을까

1. 동기화 비용 멀티 스레드는 공유된 데이터를 읽고 쓰는 과정에서 동기화 문제가 발생할 수 있다. 그리고 동기화 문제를 해결하기 위해 뮤텍스, 세마포어 등의 기법을 사용한다. 이때 뮤텍스, 세마포어는 데이터에 접근할 때 락을 획득하고 사용 후에는 락을 해제하는 작업을 수행한다. 이렇게 락을 획득하고 해제하는데 추가적인 시간이 소요된다. 따라서 스레드가 많아진다면 당연히 공유된 데이터에 접근하는 스레드가 많아질 것이고 동기화 기법으로 인한 추가적인 시간이 더 소요될 것이다. 2. 거짓 공유 (False Sharing) 먼저 다음과 같이 A라는 배열을 공유한다고 해보자. public interface FalseSharingThread extends Runnable { int[] A = new int[100..

CS 2024.01.06

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
728x90