사람은 망각의 동물이다

까먹지 말고 기록하자

분류 전체보기 26

스프링 빈 생명주기 콜백

스프링 빈을 통해 데이터 베이스 등 외부 서비스와 커넥션을 관리하는 용도로 사용될 수 있다. 외부 커넥션을 사용하기 위해서는 커넥션을 맺는 행동도 중요하지만 커넥션을 잘 닫는 행위 역시 중요하다. 스프링 빈을 통해 관리되는 경우 생명주기 콜백을 사용하여 적절한 connet, close 를 보장할 수 있다. 스프링 생명주기 콜백 구현 방법 스프링의 생명주기 콜백을 사용하는 방법은 3가지 정도가 있다. 콜백 인터페이스 상속 @Bean 을 통한 콜백 정의 @PostConstruct, @PreDestroy 어노테이션을 사용한 콜백 정의 (추천) 콜백 인터페이스 상속 생명주기 콜백을 정의한 인터페이스를 상속하여 각 메소드를 구현한다. 생명주기에 맞게 해당 메소드들이 수행된다. InitializingBean 빈의 ..

Spring 2021.12.01

@Qualifier와 @Primary

두 어노테이션은 스프링 컨테이너에 동일한 타입의 빈이 여러개 등록되었을 때, 특정 빈을 선택할 수 있는 기능을 제공한다. 같은 타입의 스프링 빈이 중복으로 등록되는 경우 Policy.java public interface Policy {} @Component public class NomalPolicy implements Policy { } @Component public class VipPolicy implements Policy { } MainService.java public class MainService { private final Policy policy; @Autowired public MainService(Policy policy) { this.policy = policy; } } Main..

Spring 2021.11.30

@Autowired 옵션 처리

스프링 컨테이너에서 관리되는 빈이 아닌 경우 @Autowired 를 하게 되면 오류가 발생한다. NoSuchBeanDefinitionException 스프링 컨테이너에 없는 빈의 의존관계를 주입하는 경우 옵셔널하게 처리할 수 있다. Autowired의 required 옵션을 추가한다. @Nullable 어노테이션을 추가한다. Optional 타입으로 선언한다. 샘플코드 static class TestBean { // Member 는 스프링빈에서 관리하는 객체가 아니다. @Autowired(required = false) public void setNoBean1(Member noBean1) { System.out.println("noBean1 = " + noBean1); } @Autowired public..

Spring 2021.11.29

스프링 의존관계 자동주입 (@Autowired)

스프링 컨테이너에 등록되어 있는 스프링 빈들의 의존관계를 자동으로 주입하기 위해선 @Autowired 키워드를 사용할 수 있다. @Autowired 키워드는 상황에 때라 사용할 수 있는 방법은 여러가지가 존재한다. 생성자 주입 수정자(setter) 주입 필드 주입 일반 메서드 주입 생성자 주입 생성자 주입은 가장 흔하고 보편적으로 사용하는 의존관계 자동 주입 방법이다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServic..

Spring 2021.11.29

Bean Factory 와 Application Context

BeanFactory 스프링 컨테이너의 최상위 인터페이스이다. 빈을 조회하고 관리하는 역할을 담당한다. getBean 등등 ApplicationContextpublic interface ApplicationContext extends EnvironmentCapable, MessageSource, ApplicationEventPublisher, ResourcePatternResolver, ListableBeanFactory, HierarchicalBeanFactory { ... } BeanFactory의 모든 기능을 상속하는 인터페이스다. 빈을 관리하고 조회하는 기능 + 수 많은 부가 기능을 지원한다. MessageSource 메시징에 대한 국제화 기능을 제공한다. EnvironmentCapable 환경별..

Spring 2021.11.23

스프링 컨테이너에 등록된 모든 빈 조회

스프링 컨테이너에 등록된 모든 빈의 정보를 조회하는 방법을 소개한다. DI 컨테이너 @Configuration public class AppConfig { @Bean public DiscountPolicy discountPolicy() { return new FixDiscountPolicy(); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { ..

Spring 2021.11.22

좋은 객체 지향 설계의 5가지 원칙(SOLID)

SRP 단일 책임 원칙 하나의 클래스가 하나의 책임만을 가져야한다. → 사실상 실무에선 애매한 경우가 많다. 단일 책임 원칙이 잘 지켜진 경우는 어떤 변경이 있을 때 전체를 수정하지 않고 특정 일부분만 수정하면 될 때를 의미한다. OCP 개방-폐쇄 원칙 확장에는 열러있지만 변경에는 닫혀야 한다. → 이상하게 말이 잘 안되는 느낌이다. 결국 OCP는 객체 지향의 다형성을 활용하면 지켜질 수 있다. 새로운 기능이 추가됐을 때, 기존 코드는 변경하지 않고 새로운 기능을 수행할 구현 객체를 추가하고 대체하여 쉽게 확장한다. → 인터페이스로 통신해야하는 이유!! LSP 리스코프 치환 원칙 기존 코드에서 수행하는 역할은 하위 타입의 인스턴스로 변경해도 실행에 영향이 없어야 한다. 컴파일 단계의 원칙이 아니라 로직을..

Spring 2021.11.19

스프링의 핵심 컨셉

스프링은 자바 진형에서 표준으로 사용되고 있는 프레임워크 이다. 스프링은 개발에 필요한 다양한 기능을 제공하고 있다. DI AOP IoC 트랜잭션 관리 데이터 접근 제어 등등 하지만 스프링이 만들어진 핵심적인 이유는 단순히 기능을 제공하는 것이 아니다. 기능 제공은 핵심 컨셉에 의해 파생된 것들이라고 생각할 수 있기 때문에 반드시 핵심 컨셉을 이해해야한다. 그렇게 된다면 스프링에서 제공하는 여러 기능들이 왜 제공되고, 또 어떻게 사용해야하는지를 이해할 수 있다. 스프링의 핵심 컨셉 스프링은 자바를 기반으로 제공하는 기술이다. 자바의 가장 큰 특장점은 객체 지향 을 통한 유연한 설계가 가능하다는 것이다. 결과적으로 스프링은 자바의 특장점을 살려 개발자들로 하여금 더 좋은 객체 지향을 설계 할 수 있도록 도..

Spring 2021.11.19

스프링이란?

스프링이 만들어지기 전에는 어떤 기술이 있었는지 먼저 살펴보고, 이후 스프링이 어떤 핵심 가치를 가지고 탄생을 하게 됐는지에 대한 내용을 작성합니다. 그리고 스프링의 핵심 가치인 "객체 지향 설계"에 대한 내용을 살펴봅니다. 스프링이 만들어지기 전 EJB (Enterprise Java Bean) 당시 자바에서 제시하는 표준 기술이었다. 기업용 자바빈 컴포넌트를 관리하는 기능을 제공하는 서버 어플리케이션이다. 스프링과 마찬가지로 빈을 활용한 여러가지 사용성을 제공했다. 데이터 베이스와의 연결하여 쿼리 등을 자동으로 생성 등등 하지만 비싼 가격, 플랫폼에 종속적인 개발, 어려운 사용성 등 단점 때문에 불편을 갖는 개발자들이 존재했다. Spring EJB 를 사용하기 어려워서 한 개발자가 직접 프레임워크를 만..

Spring 2021.11.19

brew services start 권한 오류 해결법

맥에서 brew를 통해 mysql을 설치하고 인스턴스를 띄우려고 하는데 권한 오류가 발생했다. 오류 로그 Error: Permission denied @ rb_sysopen - /Users/kyungseok.park/Library/LaunchAgents/homebrew.mxcl.mysql.plist 에이전트를 실행하기 위한 폴더 자체에 권한이 존재하지 않아서 발생한 오류로 판단하여 권한을 줘봤다. chmod 744 com.kaspersky.kav.delayed_start.plist 그래도 동일한 오류가 발생해서 777 로 시도해봤지만 해결되지 않았다. 스택오버플로우를 참고해보니 LaunchAgents 폴더의 소유권을 변경해서 해결했다고 했다. sudo chown /Users/kyungseok.park/L..

homebrew 2021.11.12