728x90
Java & Spring
54

프로메테우스와 그라파나를 활용한 Response Time 모니터링

프로메테우스 설치 및 실행 brew install prometheus -> 설치 brew services start prometheus -> 실행 ps -ax | grep prometheus -> prometheus.yml 위치 확인 prometheus.yml에 설정된 호스트 주소로 접속 Spring Dependency 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-core' runtimeOnly 'io.micrometer:micrometer-registry-prometheus' properties 설정 management: server: ..

Java & Spring 2024.02.14

[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] Projection - 필요한 특정 필드만 조회하여 쿼리 최적화 수행

먼저 다음과 같이 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에는 i..

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

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