목록프로그래밍/Spring4 (5)
有希
리플렉션? Runtime 중에 Class 클래스로부터 다른 클래스의 정보를 취득하거나 인스턴스를 생성하는 것. Class 클래스는 또 머여? 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성된다. class 파일에는 멤버변수, 메소드, 생성자 등 객체의 정보가 포함되어 잇는데, Class 클래스는 이 class파일에서 객체에 정보를 가져올 수 있다. 여담) 1년 정도 전에 외국 회사의 서류를 뚫고(!) 면접을 봤었는데 거기서 리플레션이 뭔지 아냐, 써봤냐에 대해 물어봤다. C++, nodejs를 만지적거리던 나는 당연히 몰랐고 이어지는 Iaas, Paas, Saas 등의 질문에 박살이 났고 떨어졌다 -_-... DI컨테이너가 리플렉션을 이용해 인스턴스를 생성하면 그에 따른 성능 저하?를..
스프링 DI 컨테이너에는 인스턴스의 생성과 소멸 타이밍에 호출되는 메서드를 결정하기 위해 @PostConstruct와 @PreDestroy라는 2개의 어노테이션이 있다. (Java SE 6 이상) @PostConstruct: 초기 처리를 하는 메소드 선언. 메소드 이름은 상관없다. 인수는 없고, 반환형은 반드시 void이다. @PostConstruct public void init() {...} @PreDestroy: 종료 처리를 하는 메소드 선언. 마찬가지로 인수는 없고, 반환형은 void이다. @PreDestroy public void stop() {...} @PostConstruct는 DI컨테이너에 의해 인스턴스 변수에 무언가 인젝션된 다음에 호출된다. 즉, 인젝션된 값으로 초기 처리를 할 때 사용..
DI컨테이너가 관리한, 주로 인젝션을 위한 인스턴스를 설정하는 것. 클래스 선언 앞에 @Component를 붙이면 스프링의 DI컨테이너가 찾아서 관리하고 @Autowired가 붙은 인스턴스 변수나 메서드에 인젝션해준다. 또한, 이름을 붙여서 관리하고 싶으면 @Component("이름") 처럼 이름을 붙여서 사용할 수도 있다. 용도에 따라 표시를 명확히 하기 위해 4가지로 분화된다. @Controller: 프레젠테이션 층 스프링 MVC용 어노테이션(사용자에게 보여지는 화면) @Service: 비즈니스 로직 층 Service용 어노테이션. @Component와 동일 @Repository: 데이터 액세스 층의 DAO 어노테이션 @Configuration: Bean 정의를 자바 프로그램에서 실행하는 JavaCo..
인젝션(의존 관계)를 받기 위한 설정 @Autowired public void setFoo(Foo foo) { this.foo = foo; } 인젝션, 의존 관계에 대해 생각해 봤는데, 이런 의미인거 같다. -> "내 기능을 완성하기 위해 다른 클래스가 필요하다.(의존)" 즉, 나 스스로 완전하지 않고 다른 녀석이 있어야 한다. 인자가 여러개여도 가능하고, 생성자에도 가능하다. 그리고, autowired가 어떻게 알아서 적절한 클래스를 가져와서 완성시켜주는가? 에 대한 답은 -> @Component가 붙은 녀석들 중 맞는 녀석을 데려온다. 이렇게 하면 인젝션이 필수가 아니게 할 수도 있다. @Autowired(required = false) public void setFoo(Foo foo) { this...
public static void main(String[] args) { ProductSampleRun productSampleRun = new ProductSampleRun(); productSampleRun.execute(); } execute 에서는 Product Service 를 DI로부터 가져오고 productservice.addProduct를 통해 100엔짜리 공책을 추가한다. productservice.findByProductName을 통해 공책과 가격을 가져온다. 구조는 이렇다. ProductSampleRun ProductService ProductDAO DB Service와 DAO는 인터페이스이고, 인터페이스를 구현한 클래스가 따로 있다. 우리는 Service라는 인터페이스를 통해 '로직..