본문 바로가기

ALL

(128)
1-8) 스프링 리소스(Resource): Resource, ResourceLoader - 스프링 리소스: Resource 추상 클래스 서비스를 개발하다 보면 리소스 파일에 접근할 일이 종종 있다. 설정 정보를 불러오기위해 resources 폴더의 .properties 파일에 접근하기도 하고, 외부 사이트의 이미지 파일을 불러오기도 한다. 스프링에는 리소스에 접근하기 위한 추상클래스 Resource가 존재하고, 각 상황별로 쓸 수 있는 구현 클래스가 존재한다. - 스프링 리소스 편하게 가져오기: ResourceLoader 개발자 입장에서는 상황에 맞는 Resource 구현 클래스를 사용해야 한다는 것 자체가 부담으로 다가올 수 도 있다. 그래서 스프링에서는 ResourceLoader가 존재한다. ResourceLoader는 리소스의 경로를 보고 적절한 Resource 구현 클래스를 사용하고..
1-7) 스프링 프로파일(Profile): @Profile - 스프링 프로파일(Profile) 상용 서비스를 출시하면, 서비스가 운영되고있는 운영 서버와 추가 개발을 위한 개발 서버를 분리하는 것이 보통이다. 개발을 하다보면 새로운 버그가 생길 수 있고, 자주 소스를 새로 배포해야하는 상황이 생기기 때문이다. 따라서 코드 또한 개발서버에서 동작해야하는 코드와, 운영서버에서 동작해야하는 코드가 분기될 수 있다. @Configuration public class DBConfig { ... // 개발 서버용 dataSource // @Bean // public DataSource dataSourceForDev() { // return new EmbeddedDatabaseBuilder() // .setType(EmbeddedDatabaseType.H2) // .setS..
1-6) 스프링 프로퍼티(Property): @PropertySource, @Value, Environment - 스프링 프로퍼티(Property) 소스 코드를 작성하다 보면, 정적으로 하드코딩된 내용을 쓸때가 있다. 대표적으로 DB의 설정정보가 그렇다. 그래서 DB 설정 정보 클래스를 보면 다음과 같이 코딩되어있다. @Configuration @Import(value = {DBConfig.class}) public class AppConfig { ... } @Configuration public class DBConfig { private String driver = "DB 접속 드라이버"; private String url = "DB 접속 URL"; private String username = "DB 접속 유저명"; private String password = "DB 접속 패스워드"; ... @Overri..
1-5) 스프링 AOP(Aspect Oriented Programming) : @Aspect, @Pointcut, @Before, @After, @AfterReturning, @AfterThrowing, @Around - AOP(Aspect Oriented Programming)란? 과거 프로그램의 규모가 커지면서 중복된 코드를 줄이고 유지보수성을 높이기 위해 OOP, 객체지향 프로그래밍이 등장하였다. 객체지향 프로그래밍은 각각의 역할을 분리하고 서로 필요할 기능을 호출하도록 하여 그 목표를 달성하였다. 웹서비스의 구조를 보면, 사용자 입장에서는 서로 다른 기능으로 보일지라도 여러 서비스와 레포지토리 객체를 공통으로 사용한다. 이렇게 공통 기능을 객체로 분리하여 코드의 재사용성을 높혔지만, 여전히 객체마다 중복해서 들어가야하는 요소들이 존재했다. 예를들어 로그의 경우, 각 객체마다 로그를 남기기 위한 별도의 코드가 삽입되어야 했다. 이렇게 각 객체를 관통하여 존재하는 중복을 제거할 필요성이 생겼다. 그리고 이를 위해 ..
1-4) 스프링 빈 생애주기(Life Cycle) 관련 기능 : BeanPostProcessor, @PostConstruct, @PreDestroy - 스프링의 빈 생애주기 관리 스프링은 DI 컨테이너로서 기능하면서, 빈의 생명주기를 관리한다. 빈의 스코프에 따라서 객체를 생성하고, 의존성의 주입하여 사용할 수 있게 해준다. 또 때가 되면, 해당 객체를 제거한다. 이렇게 객체의 생성과 초기화, 제거를 아우르는 흐름을 생명 주기라고 하고, 스프링에서는 개발자가 특정 시점에 동작하는 코드를 작성할 수 있도록 한다. 이 글에서는 BeanPostProcessor, @PostConstruct, @PreDestroy를 다루겠다. - 빈의 초기화 시점 : BeanPostProcessor BeanPostProcessor를 상속받아서 메소드를 구현하면 초기화 전후에 실행되는 코드를 작성할 수 있다. 여기서 말하는 초기화는 스프링에 의해 의존성 주입이 완료된 이후에 ..
1-3) 스프링 @ComponentScan의 다양한 설정들 : basePackages, useDefaultFilters, includeFilters, excludeFilters, lazyInit - @ComponentScan 어노테이션 스프링으로 서비스를 개발해본 적이 있다면, @ComponentScan 어노테이션이 굉장히 익숙할 것이다. ApplicationContext 설정 클래스에 @ComponentScan("패키지 경로")을 적어두면 해당 패키지에 있는 @Controller, @Service, @Repogitory, @Component 객체들이 DI 컨테이너에 등록된다. package com.package1.component; @Component class Component1{ ... public Component1(){ System.out.println("Component1 Constructor"); } ... } @Configuration @ComponentScan("com.packa..
1-2) 스프링 DI 스코프 관리 : @Bean, @Component, @Scope, @Lookup, proxyMode - DI 컨테이너의 컴포넌트 스코프(생명주기) 관리 DI 컨테이너는 등록된 객체들에 의존성을 주입하는 일 뿐 아니라, 그들의 스코프(생명주기)를 관리하는 일도 수행한다. 기본적으로 컨테이너에 등록되면 싱글톤(Singleton) 스코프를 적용한다. 싱글톤 스코프에서는 프로그램 시작부터 끝까지, 하나의 객체만을 사용한다. @Component class SingletonBean{ public SingletonBean(){ System.out.println("SingletonBean Constructor"); } ... } ... ApplicationContext context = new AnnotationConfigApplicationContext(AppContext.class); SingletonBean s..
1-1) 스프링 의존성 주입(DI), 제어의 역전(IoC) : @Bean, @Component, @Autowired, @Primary, @Qualifier - 의존성 주입(Dependency Injection, DI), 제어의 역전(Inversion of Control, IoC) 이란 큰 규모의 프로젝트를 다수와 협업하여 개발하다보면 여러 문제 상황에 직면하게 된다. 규모가 커짐에 따라, 컴포넌트의 수가 많아지고, 컴포넌트들 간의 결합 역시 복잡해지게 된다. 예를 들어서 다음과 같은 코드를 보자. class UserService { private Encoder encoder; ... public UserService(Encoder encoder){ this.encoder = encoder; } ... } ... Encoder encoder = new MyEncoder(); UserService dao = new UserService(encoder); .....