본문 바로가기

Spring 프레임워크

Spring HATEOAS를 이용한 REST 이 포스트는 스프링의 튜토리얼을 실습하는 내용이다. Building REST services with Spring this tutorial is designed to be completed in 2-3 hours, it provides deeper, in-context explorations of enterprise application development topics, leaving you ready to implement real-world solutions. spring.io 흔히 RESTful API 하면 생각나는 제일 큰 특징은 json 형식의 응답이다. 기존의 웹 서버가 사용자의 요청에 대해 템플릿 렌더링이나 JSP 등을 통해 HTML 문서를 응답으로 반환했다면 API 서버에서는 json, .. 더보기
Spring의 DB Spring에서는 JDBC, MyBatis, JPA 등 여러 가지 방법을 이용하여 다양한 데이터베이스에 접근할 수 있으며 Spring Data 프로젝트에서는 JDBC, JPA, MongoDB 등 다양한 DB 접근 모듈이 제공되고 있다. 이번 포스트에서는 이런 프로젝트가 아닌 일반 JDBC와 JdbcTemplate을 다루도록 하겠다. JDBC DriverManager Java에서 데이터베이스에 접근할 수 있는 기술인 JDBC는 DriverManager라는 클래스를 사용하여 데이터베이스에 연결할 수 있다. 이 드라이버 매니저는 JDBC 드라이버를 관리하는 클래스로 애플리케이션은 이를 이용하여 여러 종류의 데이터베이스에 유연하게 접속할 수 있다. 이는 사전에 데이터베이스의 제조사들이 자신들의 데이터베이스에 접.. 더보기
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 어노테이션이 붙은 클래스며 이 클래스의 객체가 스프링 컨테이.. 더보기