본문 바로가기
반응형

전체 글112

Bean 객체의 생성과 소멸 스프링 컨테이너는 초기화와 종료라는 사이클을 갖는다. 이 과정에서 스프링 컨테이너 내부에 존재하는 Bean 객체 또한 컨테이너의 라이프 사이클에 따라 생성과 소멸을 진행한다. 객체 생성 → 의존 설정 → 초기화 → 소멸 스프링 컨테이너가 초기화 될 때 Bean 객체의 생성 및 의존 설정이 진행된다. 이 부분은 이전 chapter를 공부하면서 살펴볼 수 있었다. InitializingBean과 DisposableBean을 구현한다면 각각 Bean 객체가 초기화, 소멸될 때 지정된 메소드가 실행된다. 코드를 통해 확인해보자. public class MemberDao implements InitializingBean, DisposableBean { @Override public void afterPropert.. 2022. 11. 13.
@Component란? @Component Component scan은 스프링이 직접 클래스를 검색해서 빈으로 등록하는 기능이다. 클래스에 @Component를 붙이면 스캔의 대상이된다. @Component가 제공해주는 기능 다음의 코드들을 통해 학습을 진행해보자. @Component("zzz") public class MemberDao implements Dao { } MemberDao 상단에 @Component("zzz") 를 작성했다. AppCtx에는 @Component 가 붙은 클래스를 스캔하는 역할의 @ComponentScan을 붙여주었다. @Configuration @ComponentScan(basePackages = {"com.example.springtest.spring5_chapter5"}) public cla.. 2022. 11. 13.
JPA를 사용해야하는 이유 모락 프로젝트를 진행하면서 JPA를 사용했지만, 사용해야 하는 이유에 대해서 생각을 정리해보지 못했다. 단순히 SQL을 직접 작성하지 않아도 되기 때문에 사용했다고 생각해왔다. JPA를 왜 사용해야 할까? 여러 가지 이유들이 있다. 1. SQL을 직접 작성하지 않아도 된다. JPA는 실행 시점에 자동으로 SQL을 만들어서 실행하므로 직접 작성하지 않아도 된다. 그렇다면 SQL을 직접 작성한다면 어떤 문제가 발생할까? 첫 번째로 SQL에 의존적인 개발을 하게 된다. 현재 모락 테이블은 아래와 같다. 더보기 모락 테이블 스키마 CREATE TABLE member ( `id` BIGINT NOT NULL AUTO_INCREMENT, `oauth_id` VARCHAR(255) NOT NULL UNIQUE, `n.. 2022. 11. 8.
@Qualifier 알아보기 @Qualifier 란? 자동 주입 가능한 빈이 두 개 이상일 때, 자동 주입할 빈을 지정할 수 있는 어노테이션이다. 예시 코드를 통해 @Qualifier를 사용해야 하는 상황을 확인해보자. 아래와 같이 MemberDao를 자동 주입 받는 MemberService가 존재한다. 그리고 MemberDao를 자동 주입 받을 수 있게 Bean으로 등록해주는 설정 파일은 다음과 같다. 이 상황에서 MemberDao 타입의 Bean을 하나 더 생성하면 어떻게 될까? 다음과 같이 설정 파일에 memberDao2를 추가했을 때, 자동 주입을 받는 쪽에서 다음과 같은 문제가 발생한다. 자동 주입 가능한 Bean이 두 개이상이므로 특정 Bean을 주입할 수가 없어서 발생하는 문제이다. 이 문제를 해결하려면 어떻게 해야할까.. 2022. 11. 8.
스프링 DI란? DI란? Dependency Injection, 즉 의존 주입이다. 의존 주입에 대해서 알아보기 전에 의존에 대해서 알아보자. 의존이란? A객체가 B객체의 메서드를 실행하는 경우 A객체는 B객체에게 의존한다고 표현한다. A객체가 B객체에게 메시지를 보내는 경우라고 생각하자. B객체가 변경될 때 A객체도 변경된다면 A객체가 B객체에게 의존하는 것이다. 의존 주입을 해야하는 이유? 의존하는 객체를 직접 생성한다면 변경에 유연하게 대처할 수 없다. 예시를 통해 확인해보자. public class Service { private Dao dao = new MemberDao(); } public class Service { private Dao dao = new UserDao(); } 위와 같이 Dao객체를 직접 .. 2022. 11. 6.
스프링이 Bean 객체를 관리하는 방법 Bean 객체란? 스프링이 생성하고 관리하는 객체를 Bean 객체라고 한다. 아래의 예시를 통해 학습을 진행해보자. @Configuration public class AppContext { @Bean public Member 멤버() { return new Member("박성우"); } } @Configuration 애노테이션은 해당 클래스를 스프링 설정 클래스로 지정한다. @Bean 애노테이션을 붙인 메서드가 반환하는 객체를 스프링에서 관리한다. 메서드의 이름인 멤버는 빈 객체를 구분할 때 사용된다. 멤버라는 이름을 가진 빈 객체를 조회하면 미리 저장되어있던 Member("박성우") 객체가 반환된다. 빈 객체 등록과 조회는 다음처럼 진행할 수 있다. public class Main { public st.. 2022. 11. 6.
테스트를 통해 JPA Entity 영속성에 대해 알아보자 (2) 예시로 사용된 코드는 깃허브를 통해 확인할 수 있습니다. 1편에 이어서 작성하는 글입니다. 이 글에서는 EntityManager의 merge 메서드에 대해 다룹니다. 학습을 진행하면서 이미 id 필드가 존재하는 Entity를 save 하면 어떻게 될까? 에 대한 의문이 생겼습니다. 이에 대해서 테스트를 진행하고, 헷갈리는 부분에 대해 정리해볼 수 있었습니다. 테스트는 아래의 Member Entity를 이용하여 진행하였습니다. 1. 이미 저장된 id를 가지는 Entity를 또 save 하면 어떻게 될까? 이에 대해 다음과 같은 테스트를 작성해보았습니다. 멤버1을 저장하고 멤버 1의 id를 이용해 멤버 2를 저장하였습니다. 이때 멤버 2를 저장하였지만, 저장된 결과로 반환된 저장된_멤버 2와는 다른 객체로 .. 2022. 8. 29.
테스트를 통해 JPA Entity 영속성에 대해 알아보자 (1) 예시로 사용된 코드는 깃허브를 통해 확인할 수 있습니다. 모락 프로젝트를 진행하면서 다양한 상황에서 영속성이 어떻게 적용되는지에 대해 정확하게 알지 못하고 JPA를 사용해왔습니다. 따라서 테스트를 통해 영속성에 대한 학습을 진행해보았고 헷갈리는 부분에 대해 정리해볼 수 있었습니다. 1편에서는 EntityManager의 persist 메서드에 대해, 2편에서는 merge 메서드에 대해 다룰 예정입니다. 테스트는 아래의 Member Entity를 이용하여 진행하였습니다. 1. save 하려는 Entity 객체와 save 후 반환되는 Entity 객체는 동일한 객체일까? 다음의 테스트를 통해 살펴보겠습니다. 위의 테스트는 통과합니다. save 하려고 만든 멤버 객체와 save 후 반환되는 저장된_멤버 객체가 .. 2022. 8. 29.
JPA entity에 validation annotation을 붙인 이유 예시로 사용된 코드는 깃허브를 통해 확인할 수 있습니다. validation annotation을 붙인 이유와 생성자 검증의 맹점에 대해 작성한 글입니다. DB에 있는 데이터들을 100% 신뢰할 수 있다!라고 생각한다면 이 글은 읽지 않으셔도 좋습니다. 모락 프로젝트를 진행하면서, Entity 필드의 검증 로직이 존재해야 하는 곳에 대한 토론을 많이 진행했습니다. 우리는 토론의 결과로 검증을 위해 Entity 필드에 validation annotation을 붙이는 것을 택했습니다. 모락에서 사용되는 Entity에 대한 예시로는 다음과 같습니다. Entity 필드에 대해 올바른 값인지 확인하는 방법은 2가지가 있습니다. 1. 위와 같이 각 필드에 validation annotation을 붙이기 2. Ent.. 2022. 8. 28.
반응형