스프링 프레임워크
자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링이라고도 한다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 프레임워크 기반 기술로서 쓰이고 있다.
인터페이스(Interface)
추상 메소드만을 가질 수 있고, 구현 메서드는 가질 수 없는 일종의 추상클래스이다.
※ 추상 메소드란 선언은 되어 있으나 코드가 구현되어 있지 않은 메소드이다. abstract 키워드를 선언하는 선언부만 존재하고, 구현부는 작성하지 않고 사용한다. 작성되어 있지 않은 구현부는 자식클래스에서 오버라이딩(Overriding)하여 사용한다.
인터페이스의 역할
- 객체를 어떻게 구성해야 하는지 정리한 설계도로, 객체의 다형성을 보여준다.
- 변수에 인터페이스가 구현된 서로 다른 구현 객체를 할당해 사용이 가능하다.
- 구현 객체를 몰라도 인터페이스 메소드만 알아도 객체 호출을 가능하게 한다.
인터페이스의 특징
- 자식 클래스가 여러 부모 인터페이스를 상속 받을 수 있다. (다중 상속 가능)
- 추상 메소드만 가지고 있다. (추상 메서드만 보유)
- 디폴드 생성자, 인자 있는 생성자 등 모든 생성자를 생성하지 못한다. (생성자 생성 불가)
- 자식 클래스는 부모 인터페이스 함수를 모두 오버라이딩 해야 한다. (메소드 오버라이딩 필수)
Lombok(롬복)
Java의 라이브러리로, 반복되는 메소드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다.
Gradle
자동으로 빌드를 도와주는 도구이다. Groovy를 기반으로 한 빌드 도구로 Ant와 Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구이다.
※ Ant : XML 기반으로 빌드 스크립트를 작성하고, 자유롭게 빌드 단위를 지정할 수 있다.
※ Maven : XML 기반으로 작성하고, 생명주기(Lifecycle)와 프로젝트 객체 모델(POM; Project Object Model)이란 개념을 도입했다.
※ Groovy : 자바 문법과 유사하여 자바 개발자가 쉽게 익힐 수 있는 장점이 있으며 Gradle Wrapper를 이요하여 Gradle이 설치되지 않은 시스템에서도 프로젝트를 빌드할 수 있다.
Gradle의 역할
- 필요한 라이브러리를 리포지토리(repository)에서 다운로드
- 소스코드 컴파일
- 테스트를 실행하여 보고서를 출력
- 클래스 파일을 아카이브(archieve)를 생성
- 아카이브 스테이징 환경 등에 배포
Dependency(의존성)
한 클래스나 객체가 다른 클래스나 객체를 사용하거나 다른 클래스나 객체와 상호 작용하는 것
• 클래스 의존 : 한 클래스에서 변경이 일어날 때 다른 클래스에서까지 영향이 계속 미치게 되는 것을 클래스 간의 의존성이 생겼다고 말한다.
• 인터페이스 의존 : 인터페이스를 사용한다. 즉, 완전 구현 클래스가 아닌 추상화시킨 클래스를 이용하는 것이다.
※ 클래스에서보다 인터페이스의 의존성이 상대적으로 더 낮다. 그래서 구현 클래스보다는 인터페이스에 DI(Dependency Injection)를 한다. 이는 객체지향 설계원칙(SOLID) 중 개방 폐쇄의 원칙(OCP; Open-Colsed Principle)과 의존성 역전 원칙(DIP; Dependency Inversion Principle)을 기반한 전략 패턴이다.
의존 관계를 인터페이스로 추상화하게 되면, 더 다양한 의존 관계를 맺을 수 있고, 실제 구현 클래스와의 관계가 느슨해지고, 결합도가 낮아진다.
Dependency Injection(DI, 의존성 주입)
DI는 의존 관계를 외부에서 결정(주입)해주는 것을 말한다. 스프링에서는 이러한 DI를 담당하는 DI 컨테이너가 존재한다. DI 컨테이너가 객체들 간의 의존 관계를 주입한다.
DI 방법
- 필드 주입 : 외부에서 변경 불가하여 테스트하기가 어렵고, DI 프레임워크가 없다면 주입할 수 없다. 되도록이면 사용 안 하는 것이 좋다.
- Setter 주입 : 선택, 변경의 가능성 있는 의존관계에 사용한다.
- 생성자 주입 : 생성자 호출 시점 때 단 1번 호출하는 것을 보장한다. 따라서 주입받은 객체가 변하지 않는 불변 의존 관계나, 반드시 객체의 주입이 필요한 필수 의존관계에 사용할 수 있다. 그리고 final 키워드를 넣을 수 있어 실수를 방지하게 도와준다.
이외에도 다른 주입 방법이 있지만 스프링은 생성자 주입을 사용하기를 권장한다. 생성자 주입을 통해 변경의 가능성을 배제하고, 불변성을 보장하는 것이 좋다.
DI 규칙
- 인터페이스를 이용하여 의존성을 만든다.
- 인스턴스를 명시적으로 생성하지 않는다.
- 어노테이션을 클래스에 부여한다.
- 스프링 프레임워크에서 인스턴스를 생성한다.
- 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.
@Component
개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 *어노테이션이다. 컴포넌트 스캔 기능에 의해 스캔될 때, 주어진 패키지 내에서 @Component가 적용된 클래스를 식별 후 빈을 생성한다.
@Component
public clss Test() {
//
}
*Annotation(어노테이션) : 사전적 의미로는 주석이라는 뜻이다. 자바에서 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다. 보통 클래스 명 위에 어노테이션을 부여한다.
@Component 어노테이션의 구체화된 형태(컴포넌트를 내부에 포함하면서 다른 의미를 내포하는 어노테이션)

- @Controller : 인스턴스 생성 지시, 스프링 MVC를 이용할 때 컨트롤러에 부여
- @Service : 인스턴스 생성 지시, 트랜잭션 경계가 되는 도메인(서비스) 기능에 부여
- @Repository : 인스턴스 생성 지시, 데이터베이스 액세스(리포지토리) 기능에 부여
@Bean
스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈을 관리한다. 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록한다.
@Autowired
- 스프링 컨테이너에 등록한 빈에게 의존관계 주입이 필요할 때 DI(의존성 주입)을 도와주는 어노테이션이다.
- 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다.
- 즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해준다.
특징
- 기본적으로 등록되어 있는 빈 중에서 타입이 일치하는 빈을 찾아서 주입한다.
- 등록된 빈의 이름과 어노테이션이 붙어 있는 변수의 이름과 일치하는 것을 찾아 주입한다.