본문 바로가기

Spring 프레임워크/이론

Spring의 AOP(Aspect Oriented Programming) 스프링에서는 AOP(Aspect Oriented Programming)를 지원하고 있다. AOP는 관점 지향 프로그래밍 등으로 많이 번역되는데 객체 지향 프로그래밍, 서비스 지향 프로그래밍 등 프로그래밍 개발론의 일종이다. AOP에서는 프로그램을 핵심 기능과 공통 기능으로 분리하여 모듈화, 재사용성을 높이고 핵심 기능 개발에만 집중할 수 있다는 장점이 있다. AOP 프로그램을 핵심 기능과 공통 기능으로 분리한다는 것은 무엇일까? 이는 애플리케이션을 개발할 때 어느 부분에 더 집중해야 하는지, 즉 어디에 좀 더 관심사(concern)를 두어야 하는지 분리하는 것이다. 구글에서 스프링 AOP를 검색하면 지겹도록 나오는 예제지만 들어보자면 어떤 메서드의 실행 시간을 측정하는 로직을 구현해야 한다고 하자. 가장.. 더보기
Spring의 생성자 의존 주입(Constructor Dependency Injection) 원래는 이전 포스트에서 작성하던 부분이었으나 너무 글이 길어지는 관계로 따로 분리하였다. Spring의 의존성 주입(Dependency Injection) 스프링의 큰 특징 중 하나는 Dependency Injection(DI, 의존성 주입)을 지원한다는 것이다. 의존성 주입 자체는 스프링에 한정된 개념이 아니고 객체 간 관계를 다루는 방법 중 하나인데 일단 의존성이 haruhiism.tistory.com 생성자 주입 위의 포스트에서는 의존성 주입 방법으로 필드 주입, Setter 메서드 주입, 생성자 주입 세 가지 방법을 제시했다. 그중 마지막 방법인 생성자 주입은 말 그대로 객체의 생성자에서 의존하는 Bean 객체를 파라미터로 넘겨받는 방식이다. @Component public class Greete.. 더보기
Spring의 빈 범위(Bean Scope) 스프링에서 Bean 객체를 생성한다는 것은 실제로는 Bean 객체를 생성하기 위한 일종의 레시피, 클래스를 정의하는 것이다. 이런 레시피를 작성하는 것은 객체의 의존성이나 설정값뿐 아니라 해당 객체의 범위(scope)를 조절할 수 있다는 특징이 있다. 특히 기존 자바 언어의 스코프와는 다른 스프링 프레임워크만의 스코프를 Bean 객체들에게 적용할 수 있는데 스프링에서는 다음과 같은 다섯 가지 스코프를 제공한다. singleton: 해당 객체는 스프링 컨테이너에서 단 하나만 존재한다. prototype: 해당 객체는 스프링 컨테이너에 몇 개든 존재할 수 있다. request: 해당 객체는 web-aware 스프링 컨테이너에 전송된 HTTP 요청마다 생성된다. session: 해당 객체는 web-aware .. 더보기
Spring의 빈 생명주기(Bean Lifecycle) 스프링의 컨테이너는 Bean 객체들을 관리한다. 객체들을 관리한다는 것은 단순히 싱글턴으로 제공하거나 필요한 곳에 주입하는 것뿐 아니라 객체의 생성과 소멸, 즉 생명주기(Lifecycle)를 관리한다는 것을 의미한다. 컨테이너와 빈의 생명주기 스프링 컨테이너 자체도 생명 주기가 있다. 간단하게는 다음처럼 ApplicationContext 구현 클래스를 이용하여 초기화하고 close 메서드로 종료하는 것을 예로 들 수 있다. public class Main { public static void main(String[] args){ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); .. 더보기
Spring의 제어 역전 컨테이너(Inversion of Control Container) 스프링 프레임워크의 핵심적인 개념에는 IoC Container, Dependency Injection 등이 있다. Dependency Injection(의존성 주입)은 지난 포스트에서도 몇 번 다뤄봤으니 이번에는 IoC Container, 즉 제어 역전(inversion of control) 컨테이너에 대해 조금 더 조사해보았다. 제어 역전(Inversion of Control, IOC) 제어 역전이라는 것은 의존성 주입과는 다르다. 의존성 주입이 결합도를 낮춰서 프로그램을 좀 더 유연하게 구축하고자 하기 위한 거라면 제어 역전은 소스 코드의 제어를 컨테이너나 프레임워크에 이전하는 소프트웨어 공학 기법이다. 이게 무슨 말이냐면 스프링 프레임워크에서 의존 자동 주입(@Autowired 등)을 할 때 이 의.. 더보기
Spring의 컴포넌트 스캔(Component Scan) 이전까지는 스프링 설정 클래스(ApplicationContext 등)에서 Bean 객체를 생성, 컨테이너에 직접 등록하여 사용했다. 그러나 컴포넌트 스캔 기능을 사용하면 설정 클래스에서 일일이 등록하지 않아도 여러 클래스의 Bean 객체를 컨테이너에 자동으로 등록할 수 있다. @Component @Component public class MemberRegisterService { ... 이 방법은 Bean 객체를 컴포넌트 클래스에 구현하면 애플리케이션 실행 시 스프링이 컴포넌트 클래스들을 탐색, Bean 객체들을 컨테이너에 등록하는 방법이다. 이를 컴포넌트 스캔(Component Scan)이라 한다. 컴포넌트 클래스는 위처럼 @Component 어노테이션이 붙은 클래스며 이 클래스의 객체가 스프링 컨테이.. 더보기
Spring의 의존 자동 주입(@Autowired) 이전 포스트에서는 Spring 프레임워크에서 어떤 식으로 DI가 이루어지는지 간략하게 살펴보았다. 의존성을 주입하려면 직접 Bean 객체를 생성하는 메서드를 호출하여 생성자에 전달하거나 Setter 메서드를 사용할 수도 있겠지만 스프링 프레임워크 자체에서 이 의존성을 주입해줄 수도 있다. 이를 의존 자동 주입이라 하며 @Autowired나 @Resource 어노테이션을 사용한다. ... public class ChangePasswordService { @Autowired private MemberDAO memberDAO; ... 간단한 사용은 위와 같다. 그냥 의존 주입이 필요한 대상에게 @Autowired 어노테이션을 붙여주면 된다. 원래는 이 ChangePasswordService 클래스에서 Memb.. 더보기
Spring의 의존성 주입(Dependency Injection) 의존성 주입 스프링의 큰 특징 중 하나는 Dependency Injection(DI, 의존성 주입)을 지원한다는 것이다. 의존성 주입 자체는 스프링에 한정된 개념이 아니고 객체 간 관계를 다루는 방법 중 하나인데 일단 의존성이라는 것은 다음과 같다. public class MemberRegisterService { private MemberDAO memberDAO = new MemberDAO(); public long regist(...){ memberDAO.requestRegiest(...); ... } ... } 위의 MemberRegisterService 클래스에서는 MemberDAO 클래스의 객체를 직접 new 연산자로 생성하여 그의 메서드를 사용하고 있다. 이 경우 MemberRegisterSe.. 더보기