목록Spring (16)
che01 님의 블로그
@EnableScheduling 애너테이션의 역할@EnableScheduling을 설정 클래스에 추가하면 Spring은 내부적으로 스케줄링 관련 인프라를 자동으로 구성한다.@SpringBootApplication@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}내부 동작 메커니즘1. ScheduledExecutorService 등록Spring은 @EnableScheduling이 활성화되면 ScheduledExecutorService를 빈으로 등록한다. 기본적으로 단일 스레드 풀을 사용하는 Th..

@Async 기본 개념@Async는 Spring이 제공하는 비동기 처리 기능입니다. 메서드에 이 어노테이션을 붙이면 해당 메서드는 별도의 스레드에서 실행되어 메인 흐름과 병렬로 작업을 수행할 수 있습니다. 프록시 기반 동작 원리프록시 생성 과정Spring은 @Async가 붙은 메서드를 감싸기 위해 프록시 객체를 생성합니다.프록시로 교체되는 시점은 Spring 애플리케이션 시작 시 Bean 생성 시점입니다. Spring이 @Async, @Transactional 등 AOP 대상 어노테이션을 감지하여 자동으로 프록시를 생성하고 Spring 컨테이너에 등록합니다.실제 실행 과정keywordService.collect(keyword); // 진짜 객체가 아닌 프록시가 호출됨실제 실행 흐름:1. keywordSe..
트랜잭션 격리수준 (Transaction Isolation Levels)격리수준이란?여러 트랜잭션이 동시에 실행될 때 데이터의 정합성과 일관성을 얼마나 보장할 것인지를 설정하는 기준이다. 격리 수준이 낮을수록 동시성 성능은 좋아지지만 데이터 정합성이 깨질 수 있다.4가지 격리수준1. READ UNCOMMITTED (레벨 0)다른 트랜잭션에서 아직 커밋하지 않은 데이터도 읽을 수 있음가장 낮은 격리 수준으로 성능은 좋지만 데이터 정합성 문제 발생 가능발생 가능한 문제: Dirty Read, Non-repeatable Read, Phantom Read2. READ COMMITTED (레벨 1)커밋된 데이터만 읽을 수 있음대부분의 DBMS에서 기본값으로 설정발생 가능한 문제: Non-repeatable Rea..
Self-invocation problem은 스프링에서 같은 클래스 내부의 메서드를 호출할 때 발생하는 문제다. AOP나 프록시가 적용된 메서드를 같은 클래스 안에서 직접 호출하면, 프록시를 거치지 않아서 의도한 기능이 동작하지 않는다.왜 발생하나?스프링은 객체를 프록시로 감싸서 AOP 기능을 제공한다. 하지만 같은 클래스 내부에서 메서드를 호출할 때는 this.method()로 호출하게 되는데, 이때 this는 프록시 객체가 아닌 실제 객체를 가리킨다. 그래서 프록시를 거치지 않아 AOP가 동작하지 않는다.실제 예제문제가 되는 코드@Servicepublic class UserService { @Transactional public void updateUser(Long userId) {..
JPA를 사용하면서 가장 자주 마주치는 성능 이슈 중 하나가 바로 N+1 문제입니다. 오늘은 N+1 문제가 무엇인지, 왜 발생하는지, 그리고 EntityGraph를 활용해서 어떻게 해결할 수 있는지 자세히 알아보겠습니다.N+1 문제란?N+1 문제는 JPA에서 연관관계가 있는 엔티티를 조회할 때 발생하는 성능 이슈입니다.문제 발생 패턴:첫 번째 쿼리로 N개의 메인 데이터를 조회 (1번의 쿼리)각 메인 데이터의 연관된 엔티티를 가져오기 위해 추가로 N번의 쿼리 실행총 1 + N번의 쿼리가 실행되어 "N+1 문제"라고 불림실제 예시로 N+1 문제 이해하기엔티티 구조@Entitypublic class Todo { @Id @GeneratedValue(strategy = GenerationType.IDE..
상속이란 무엇인가?프로그래밍에서 상속은 부모와 자식 관계를 만드는 것입니다. 예를 들어 "상품"이라는 부모가 있고, "책"과 "옷"이라는 자식들이 있다고 생각해보세요.상품: 이름, 가격 (공통 속성)책: 이름, 가격 + 저자 (상품 + 고유 속성)옷: 이름, 가격 + 사이즈 (상품 + 고유 속성)하지만 여기서 문제가 생깁니다. Java는 상속이 가능하지만, 데이터베이스 테이블은 상속 개념이 없어요!그래서 JPA는 Java의 상속 구조를 데이터베이스 테이블로 변환하는 3가지 방법을 제공합니다.전략 1: 단일 테이블 전략 (Single Table)"모든 걸 하나의 테이블에 때려넣자!"어떻게 동작하나요?부모와 모든 자식 클래스의 정보를 하나의 테이블에 저장합니다. 어떤 타입인지 구분하기 위해 DTYPE이라는 ..
N:M 연관관계란?학생과 수업 예시로 이해하기현실 상황학생 한 명이 여러 수업을 들을 수 있다하나의 수업도 여러 학생이 들을 수 있다구체적 예시학생들:- 철수: 수학, 영어 수업 수강- 영희: 수학, 과학 수업 수강- 민수: 영어, 과학 수업 수강수업들:- 수학: 철수, 영희가 수강- 영어: 철수, 민수가 수강 - 과학: 영희, 민수가 수강이처럼 서로 다:다로 연결되는 관계를 N:M (Many-to-Many) 관계라고 합니다.방법 1: 단순한 @ManyToMany 사용테이블 구조Student 테이블 student_class 테이블 Class 테이블┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐│ id (PK..
1:1 관계란 무엇인가?현실 예시로 이해하기사람 1명 ↔ 주민등록증 1개회사 1개 ↔ 대표자 1명학생 1명 ↔ 학생증 1개이처럼 하나의 A가 하나의 B와만 연결되는 관계를 1:1 관계라고 합니다.사용자와 프로필 예시로 알아보기실제 서비스에서 많이 사용하는 사용자(User)와 프로필(Profile) 관계로 설명하겠습니다.상황 설정한 명의 사용자는 하나의 프로필만 가질 수 있다하나의 프로필은 한 명의 사용자에게만 속한다1단계: 단방향 관계 (한쪽에서만 참조)방법 1: User가 Profile을 참조 (추천)테이블 모습User 테이블 Profile 테이블┌─────────────────────┐ ┌──────────────────┐│ id (PK) │ 1 │ ..
1:N 연관관계란?한 엔티티가 여러 개의 다른 엔티티를 참조하는 관계입니다.예시: 하나의 Team이 여러 명의 Player를 가지는 경우DB에서는 외래 키가 항상 N쪽(Player)에 위치객체에서는 1쪽(Team)에서 List로 N쪽을 참조1:N 단방향 관계개념Team → List 로만 참조Player는 Team을 참조하지 않음연관관계의 주인은 Team (1쪽)코드 예시@Entity@Table(name = "team")public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany @JoinColumn..
핵심 개념 요약HttpMessageConverter언제 사용되나요?상황 어노테이션HTTP 요청 데이터를 객체로 변환@RequestBody, HttpEntity, RequestEntity객체를 HTTP 응답 본문으로 변환@ResponseBody, HttpEntity, ResponseEntity우선순위byte[]StringJSON (application/json) → 보통 Jackson이 담당Spring 내부 구조핵심 구성요소HandlerMethodArgumentResolver요청 데이터를 → 컨트롤러의 메서드 파라미터로 변환사용 예: @RequestParam, @ModelAttribute, @PathVariableHandlerMethodReturnValueHandler컨트롤러의 반환값을 → 응답 본문(또는..