본문 바로가기

JAVA

(62)
[Spring] 빈 스코프(singleton bean, prototype bean) 빈 스코프란? 스프링 빈은 스프링 컨테이너 시작 때 생성되어 컨테이너 종료까지 유지된다. 이는 스프링 빈이 기본적으로 싱글톤 스코프이기 때문이다. 스코프는 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 스코프를 지원한다. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료시 까지 유지되는 가장 넓은 범위의 스코프이다. 프로트타입 : 스프링 컨테이너는 프로트타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request : 웹 요청이 들어오고 나갈 때 까지 유지되는 스코프 session : 세션이 생성되고 종료될 떄 까지 유지되는 스코프 application : 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프이다. 등록 예제*..
[Spring] 빈 생명주기의 콜백 빈 생명주기 콜백은 스프링 빈이 생성되거나 종료될 때 빈 안의 메소드를 호출하는 것이다. 목차 빈 생명주기 콜백 시작 인터페이스 InitalizingBean, DisposableBean 빈 등록 초기화, 소멸 메서드 애노테이션 @PostConstruct, @PreDestory 빈 생명주기 콜백 시작 DBCP(데이터베이스 커넥션 풀), 네트워크 소켓 등 애플리케이션 시작 전 필요한 연결을 미리 하거나 종료될 때 안전하게 종료할 수 있는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. 예제로 어떻게 초기화와 종료 작업이 이루어지는지 알아보자. public class NetworkClient { private String url; public NetworkClient() { System.out.pri..
[Spring]컴포넌트 스캔과 의존관계 자동 주입 (Component Scan, Autowired) 컴포넌트 스캔이란? 기존에 빈을 등록할 때는 자바 설정파일이나 XML을 이용해 일일이 등록해주어야 했다. 실무에서는 이렇게 등록해주어야 할 빈이 수십, 수백개가 되므로 누락하거나 반복해야하는 문제점이 발생한다. 그렇기에 스프링은 설정정보가 없어도 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔 이라는 기능을 제공한다. @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { } 컴포넌트 스캔을 사용하려면 설정정보에 @ComponentScan 어노테이션을 달아준다. 기존 설정파일..
[Spring] 스프링과 싱글톤 웹서비스는 대량의 트래픽을 고려하여 설계되어야 한다. 스프링은 기업의 온라인 서비스 기술을 지원하기 위해 탄생했기에 대량의 트래픽에 대한 문제점을 해결책을 갖고있다. 스프링이 없는 DI의 경우 void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회 : 호출할 때 마다 객체 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회 : 호출할 때 마다 객체 생성 MemberService memberService2 = appConfig.memberService(); //참조값이 다른 것을 확인 System.out.println("memberService1 = " + membe..
[Spring] 스프링 빈 조회하기 모든 Bean 출력하기 메소드 getBeanDefinitionNames() // 스프링의 모든 빈 이름으로 조회 ac.getBean(빈 이름 입력) // 빈 이름으로 빈 객체(인스턴스) 조회 코드 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " ..
스프링의 역사 공부를 시작한지 6개월이 조금 넘었지만 벌써 취업을 하게 됐다. 스스로 부족한 점이 많다고 느껴져서 잘 할 수 있을지 걱정도 되고 설레이기도 하다. 스프링의 탄생 초기의 기업들은 자바의 표준 기술로 Enterprise Java Bean을 사용했다. EJB는 트랜잭션, 분산기술, Entity Bean (ORM)등 기술을 지원하여 많은 기업들이 사용하였다. 하지만 비싸고, 어렵고, 복잡하고, 느린 단점이 있었다. EJB의 단점이 너무 심한 나머지 초기의 순수자바(POJO)를 사용하자는 이야기 까지 나왔다. 실무 개발자들이 EJB를 대신 할 오픈소스를 만들다.(Rod Johnson, Gavin King) Rod Johnson은 당시의 EJB를 비판하며 나중에 스프링을 만들어 냈고 Gavin King는 EJB의..
[Spring] JUnit 단위테스트 요령 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드, 웹 환경에서는 컨트롤러를 통해서 해당 기능을 실행할 수 있다. 이러한 방법은 준비 실행 과정이 너무 오래걸리고, 반복 실행하기 어렵고, 여러 테스트를 한번에 실행하기 어려운 단점이 있다. 그렇기 때문에 자바는 JUnit이라는 프레임 워크로 테스트를 실행해서 이러한 문제를 해결한다. public class MemoryMemberRepository implements MemberRepository { private static Map store = new HashMap(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++s..
[Spring] Gradle build 중 JDK Version 문제 해결 김영한님의 스프링 인강을 보고 따라하는데 명령 프롬프트에서 gradlew build 명령어를 입력하면 계속 저 오류가 떴다. 내용은 즉 Java11로 빌드해야하는데 지금 세팅이 JDK 8에 물려있다고 하는거 같다. 구글에 검색해서 블로그부터 Q&A사이트 , Gradle doc 등등 찾아봐도 해결되지 않았다. 이클립스에서 인텔리J로 갈아타보고, 환경변수 세팅, 레지스토리 세팅, 자바 컨피그 세팅, IDE 세팅, JAVA 재설치 등등 할 수 있는 모든걸 다했는데도 안고쳐졌다. 최후의 방법으로 그냥 기존에 사용하던 Java1.8을 싹다 지워주었다. 그랬더니 해결됐다. 덕분에 오늘 반나절을 날려보냈다. 올바른 해결방법은 아닌 것 같아, 기존의 프로젝트들의연동이나 설정이 어떻게 꼬일지는 모르겠지만 일단 해결됐으니..