백엔드/SPRING

·백엔드/SPRING
빈 생명주기 콜백 시작스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다.  스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다. 따라서 안전하게 종료 작업을 진행할 수 있다. [스프링 빈의 이벤트 라이프 사이클]스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출소멸전 콜백 : 빈이 소멸되기 직..
·백엔드/SPRING
다양한 의존 관계 주입 방법생성자 주입이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다불변, 필수 의존 관계에 사용된다@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository =..
·백엔드/SPRING
컴포넌트 스캔과 의존관계 자동 주입 시작하기지금까지 스프링 빈을 등록할 때, 자바의 코드의 @Bean이나 XML의 등을 통해서 설정정보에 직접 등록할 스프링 빈을 나열했었다. 하지만 이런 식으로 하다보면 수십, 수백 개의 빈을 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생할 수 있다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또한 의존관계도 자동으로 주입하는 @AutoWired 라는 기능을 제공한다 @Configuration@ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configur..
·백엔드/SPRING
웹 애플리케이션과 싱글톤웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.스프링 없는 순수한 DI 컨테이너는 요청이 올 때마다 새로운 객체를 생성한다 요청이 올 때마다 새로운 객체를 생성하면 메모리 낭비가 너무 심해진다.이에 대한 해결방안은 해당 객체가 딱 1개만 생성되고 공유하도록 설계하는 방법이다.  싱글톤 패턴싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다//1. static 영역에 객체를 딱 1개만 생성해둔다.private static final SingletonService instance = new SingletonService();//2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.public..
·백엔드/SPRING
스프링 컨테이너 생성// 스프링 컨테이너 생성ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);ApplicationContext를 스프링 컨테이너라고 한다ApplicationContext는 인터페이스이고, AnnotationConfigApplicationContext는 이 인터페이스를 구현한 구현체이다. 스프링 컨테이너의 생성 과정1. 스프링 컨테이너 생성ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class) 코드를 통해서 스프링 컨테이너를 생성한다. 스프링 컨테이너를 생성할 때는 구성 정보를 지정해주어야 하는데 여기서는 Ap..
·백엔드/SPRING
좋은 객체 지향 프로그래밍이란?객체 지향 프로그래밍컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다 역할과 구현을 분리역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해 진다클라이언트는 대상의 역할(인터페이스)만 알면 된다클라이언트는 구현 대상의 내부 구조를 몰라도 된다클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다 자바 언어의 다형성을 활용한다. 역할은 인터페이스, 구현은 인터페이스를 구현..
·백엔드/SPRING
경로 표현식경로 표현식이란 .(점)을 찍어 객체 그래프를 탐색하는 것이다.select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 정리상태 필드 : 단순히 값을 저장하기 위한 필드연관 필드 : 연관 관계를 위한 필드- 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티- 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 경로 표현식 특징상태 필드 : 경로 탐색의 끝이다. 더는 탐색할 수 없다JPQL: s..
·백엔드/SPRING
객체 지향 쿼리 언어 소개 EntityManager.find()나 객체 그래프 탐색은 가방 단순한 검색 방법이다. 하지만 이 기능만으로는 애플리케이션을 개발하기 어렵다. 예를 들어, 나이가 18살 이상인 회원을 모두 검색하고 싶자면 좀 더 현실적이고 복잡한 검색 방법이 필요하다. 그렇다고 해서 모든 회원 엔티티를 메모리에 올려두고 검색하는 것은 현실성이 없다. 결국 데이터는 데이터베이스에 있으므로 SQL로 필요한 내용을 최대한 걸러서 조회해야 한다. 하지만 ORM을 사용하면 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 검색도 엔티티 객체를 대상으로 하는 방법이 필요하다.  JPQL은 이러한 문제를 해결하기 위해서 만들어졌다.테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.SQL..
·백엔드/SPRING
JPA의 데이터 타입 분류JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다 엔티티 타입엔티티 타입은 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 기본값 타입은 String, int처럼 자바가 제공하는 기본 데이터 타입이고, 임베디드 타입은 JPA에서 사용자가 직접 정의한 값이다. 마지막으로 컬렉션 값 타입은 하나 이상의 값 타입을 저장할 때 사용한다. 기본값회원 엔티티에서 name..
·백엔드/SPRING
프록시Member를 조회할 때 Team도 함께 조회를 해야 할까?  회원 이름과 소속 팀을 함께 출력해야 하는 경우에는 팀 객체도 조회해야 하지만, 회원 이름만 출력해야 하는 경우에는 팀 객체를 조회할 필요가 없다.  프록시 기초em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회  프록시 엔티티 객체는 실제 클래스를 상속받아 만들기 때문에 겉모양이 동일하다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.  프록시 객체는 실제 객체의 참조(target)을 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 이 때, target은 DB에 S..
-minari-
'백엔드/SPRING' 카테고리의 글 목록