Dev/Spring

Dev/Spring

[Spring] @Cacheable의 동작 원리

1️⃣ @Cacheable의 핵심 동작 방식Spring의 @Cacheable은 AOP 기반으로 동작한다. 즉, Spring이 만든 프록시 객체가 캐시 여부를 판단하고, 있으면 반환, 없으면 메서드 실행 및 캐싱을 진행한다. 주의사항은?@Servicepublic class FibonacciService { @Cacheable("fibonacci") public int fibonacci(int n) { if (n 같은 클래스 안에서 fibonacci(n - 1)처럼 자기 자신을 직접 호출하면, 프록시를 거치지 않기 때문에 @Cacheable이 동작하지 않는다. 결과적으로 O(2ⁿ) 재귀 호출이 그대로 실행되어, 캐시를 다는 의미가 사라진다. 위 코드에서 캐시를 적절히 사용하려면 아래와..

Dev/Spring

[Spring] 관심사를 분리하는 이유

특정한 관심사에 따라 기능을 나누고, 각 기능을 독립적으로 개발한 뒤 이를 조합하는 방식으로 복잡한 소프트웨어를 구성해 보자는 아이디어를 관심사의 분리(Separation of concerns, SoC)라고 한다. 관심사를 분리하여 코드를 작성하게 되면, 독립된 특정 기능에 집중할 수 있기 때문에 코드를 파악하는데 수월하며 특정 기능을 변경하거나 추가할 때도 그 부분만 교체하면 되기 때문에 훨씬 간단하게 문제를 해결할 수 있다.  정리모듈이 하나의 목적만 가지도록 만들기 위함이다. 다양한 기능을 가지지 않고 하나의 기능만 가짐으로써 수정될 이유도 한 가지만 가진다. 하드웨어보다 유연하게 수정할 수 있는 소프트웨어는 변화에 유연하게 대응해야 한다. 그러나 모듈마다 여러 기능을 가지고 있으면 수정의 복잡도가..

Dev/Spring

[Junit] id to load is required for loading 해결 방법

상품 주문 관련 테스트 코드를 돌리고 있는데 에러가 발생했다. id to load is required for loading; nested exception is java.lang.IllegalArgumentException: id to load is required for loading org.springframework.dao.InvalidDataAccessApiUsageException: id to load is required for loading; nested exception is java.lang.IllegalArgumentException 에러 문구를 읽어보니 id값에 문제가 있는 것 같았다. 에러가 발생한 위치를 확인해 보니 엔티티 매니저에서 아이템을 꺼내올 때 발생하는 문제였다. 에러 ..

Dev/Spring

[Spring] Entity 설계시 주의할 점

인프런 김영한 선생님 를 보고 정리한 내용입니다. 📍 엔티티에는 가급적 Setter를 사용하지 말자 Setter를 열어두면 변경 포인트가 너무 많아져 유지보수가 어렵다. 📍 모든 연관관계는 지연로딩으로 설정하자 즉시로딩(EAGER)은 예측이 어렵고 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. (뜬금없는 의견이지만 N+1보단 1+N이 맞는 것 같다.) 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다. 연관된 엔티티를 함께 조회해야 한다면, fetch join 또는 엔티티 그래프 기능을 사용한다. OneToOne, ManyToOne 관계는 디폴트값이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다. ..

Dev/Spring

[H2] zsh: permission denied: ./h2.sh

H2 DB를 설치하고 실행하는 과정에서 발생한 문제다. 권한 문제여서 chmod로 쉽게 해결할 수 있었다. chmod 755 h2.sh// 먼저 권한을 준 뒤에 ./h2.sh// 다시 재실행 하면 된다.

Dev/Spring

[Spring] BeanFactory와 ApplicationContext 차이점

인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다. BeanFactory 스프링 컨테이너의 최상위 인터페이스 스프링 빈을 관리하고 조회하는 역할을 담당 getBean()을 제공 ApplicationContext BeanFactory의 기능을 모두 상속받아서 제공 다른 인터페이스를 상속받아 구현하여 부가 기능도 함께 제공 차이점 1. 부가 기능 ApplicationContext는 BeanFactory가 갖고 있지 않은 다른 인터페이스를 구현한다. 메시지 소스를 활용한 국제화 기능 : 실행되는 나라에 맞춰 언어 변경 환경 변수 : 로컬, 개발, 운영 등을 구분해서 처리 애플리케이션 이벤트 : 이벤트 발행 및 구독 모델 지원 편리한 리소스 조회 : 파일, 클래스패스, 외부 등에서 리소스 조..

Dev/Spring

[Spring] 생성자 주입을 선택해야 하는 이유

인프런 김영한 선생님 스프링 핵심 원리 강의를 듣고 정리한 내용입니다. 다양한 의존관계 주입 방법 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } 생성자를 통해 의존관계를 주입하는 방법 생성자이기 때문에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에서 사용 생성자가 1개 있을 경우 @Autowired를 생략해도 자동 주입된다. (..

Dev/Spring

[Spring] @ComponentScan

인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다. 컴포넌트 스캔이란 설정 정보(AppConfig)가 없어도 자동으로 스프링 빈을 등록하는 기능 의존관계도 자동으로 주입하는 @Autowired 기능도 제공 1. @ComponentScan @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때 스프링 빈의 기본 이름은 클래스명을 사용하되, 맨 앞글자만 소문자로 바꿔준다. 이렇게 클래스 위에 @Component를 붙여주면 해당 클래스는 스프링 빈으로 등록된다. Q. 그러면 기존에 의존관계 주입을 해주던 코드가 없어졌는데 어떻게 주입하나요? A. @Autowired를 사용하면 됩니다. 2. @Autowired 지정하여 의존관계 자동 주입 생성자에..

yo0oni
'Dev/Spring' 카테고리의 글 목록