03장. 스프링 프레임워크의 핵심 기능 알아보기

박근수·2024년 3월 10일
0

스프링 북스터디

목록 보기
3/8
post-custom-banner

스프링 프레임워크 기능

의존성 주입

첫 번째 기능은 의존성 주입(Dependency Injection)으로, 약어로 DI, 의존성 주입은 '의존하는 부분을 외부에서 주입하는 것'을 의미함

관점 지향 프로그래밍

두 번째 기능은 관점 지향 프로그래밍(Aspect Oriented Programming)으로 약어는 AOP

  • 중심적 관심사(Primary Concern) : 실현해야 할 기능을 나타내는 프로그램
  • 횡단적 관심사(Crosscuttin-Concern) : 본질적인 기능은 아니지만 품질이나 유지보수 등의 관점에서 반드시 필요한 기능을 나타내는 프로그램

공통 처리 등의 '횡단적 관심사'를 추출하고 프로그램의 여러 곳에서 호출할 수 있게 설정함으로써 개발자는 실현해야 할 기능인 '중심적 관심사'에만 집중해서 작성하면 되는 구조

(칼럼) AOP의 개념

회식에 비유하자면 '먹고 마시는 것'을 '중심적 관심사'라고 한다면 '가게의 선정이나 인원 수 조정'을 '횡단점 관심사'라고 표현한다. 누구나 가능하면 '먹고 마시는 것'만 하고 싶어 하지만 그 외의 작업도 누군가는 해야 하는데, 그 일을 편안하게 해주는 역할을 하는 것이 AOP이다.

DI 컨테이너 알아보기

의존성

'사용하는 객체'를 A 클래스라고 하고 '사용되는 객체'를 B라고 정의함
A 클래스에서 B 클래스를 사용하려면 B 클래스의 인스턴스를 생성하고 메서드를 사용 B 클래스에서 구현했던 메서드를 변경하면 A 클래스에서도 메서드를 변경해야함 이 관계를 'A 클래스는 B 클래스에 의존한다' 표현

클래스 의존

'사용하는 객체' 클래스에서 '사용되는 객체' 클래스의 타입을 직접 지정해 버리면 '사용되는 객체' 클래스를 변경할 경우 이를 이용하고 있는 곳을 모두 수정해야 한다. 한두 군데면 문제가 없을 수 있지만 수정한 부분이 늘어나면 실수가 발생할 위험이 높아진다.

인터페이스 의존

전제조건 : I 인터페이스가 있고 그것을 구현한 '사용되는 객체'인 B 클래스가 있다. '사용되는 객체'인 A 클래스에서 B 클래스의 methodX 메서드를 호출

  • A 클래스에 new 키워드를 사용하여 B 클래스의 인스턴스 생성
  • 인스턴스에서 methodX 메서드 호출

주의점 : A 클래스에서는 인터페이스로 추상화된 I 를 이용한다는 점.

  • 이 과정에서 설계 변경이 발생, A 클래스를 변경하게 되었음. 새롭게 작성된 '사용되는 객체' C 클래스 (I 인터페이스를 구현) 를 호출해 methodX 메소드를 호출하도록 변경.

위 과정을 통해 얻는 이점

  • 인터페이스는 참조를 받는 유형으로 사용할 수 있으므로 변수의 이름을 변경하지 않아도 된다.
  • 인터페이스가 선언된 메소드를 이용하면 클래스가 바뀌어도 메소드명을 변경하지 않아도 된다.

DI 컨테이너

의존성 주입은 '의존하는 부분을 외부에서 주입하는 것'

  • 의존하는 부분이란 '사용하는 객체' 클래스가 작성된 상태
  • 외부로부터 주입이란 '사용하는 객체' 클래스의 밖에서 '사용되는 객체' 인스턴스를 주입

인스턴스를 생성하는 데 new 키워드를 사용했지만 인스턴스 생성과 같은 작업을 프레임워크에 맡길 수 있고 그 역을 하는 것이 DI 컨테이너 입니다. 스프링 프레임 워크는 임의로 구현한 클래스를 인스턴스로 만들어주는 기능을 제공

DI 컨테이너 다섯 가지 규칙

  1. 인터페이스를 이용하여 의존성을 만든다.
  2. 인스턴스를 명시적으로 생성하지 않는다.
  3. 어노테이션을 클래스에 부여한다.
  4. 스프링 프레임워크에서 인스턴스를 생성한다.
  5. 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.

인스턴스 생성 어노테이션

  • @Controller : 인스턴스 생성 지시, 스프링 MVC를 이용할 떄 컨트롤러에 부여
  • @Service : 인스턴스 생성 지시, 트랜잭스 경계가 되는 도메인(서비스) 기능에 부여
  • @Repository : 인스턴스 생성 지시, 데이터베이스 액세스(레포지토리) 기능에 부여
  • @Component : 위 용도 이외의 클래스에 부여

DI 프로그램 요약

  • 스프링 프레임워크는 임의로 구현한 클래스를 인스턴스화하는 기능을 제공(DI 컨테이너)
  • 스프링 프레임워크를 사용한느 애플리케이션은 인스턴스를 명시적으로 생성하지 않음(new 키워드 X)
  • 정해진 어노테이션(@Component)을 클래스에 부여하는 것으로 스프링 프레임워크가 인스턴스를 생성
  • 생성된 인스턴스를 사용하고 싶은 부분에서 필드를 준비하고 주석(Autowired)을 부여하면 스프링 프레임워크가 인스턴스가 필요한 것으로 판단하고 인스턴스를 주입
  • 인터페이스를 이용해서 의존성을 만들고 DI를 사용하여 '사용되는 객체' 클래스를 변경하는 경우 '사용하는 객체'클래스의 수정 없이 변경 가능

어노테이션 역할 알아보기

어노테이션을 세 가지 항목으로 설명

  1. 어노테이션은 주석을 의미하는 영어 표현
  2. '@xxx'와 같은 형태로 작성
  3. 외부 소프트웨어에 필요한 처리 내용을 전달

레이어별로 사용할 인스턴스 생성 어노테이션

애플리케이션을 만들 때는 레이러로 나누는 것이 좋다. 레이어(layer)란 '층'의 의미로, 계층 구조로 되어있는 각 층을 뜻함. 복잡한 전체 내용을 한 번에 정리해 이해하지 말고 계층화 하여 계층별로 대상의 의미를 이해하는 것

도메인 주도 설계(Domain-Driven Design)

레이어개요
애플리케이션 레이어
(Application Layer)
클라이언트와의 데이터 입출력을 제어하는 레이어
도메인 레이어
(Domain Layer)
애플리케이션의 중심의 되는 레이어로서 업무 처리를 수행하는 레이어
인프라스트럭처 레이어
(Infrastructure Layer)
데이터베이스에 대한 데이터 영속성(Persistence Context) 등을 담당하는 레이어

레이어별 인스턴스 생성 어노테이션

어노테이션개요
@COntroller애플레이케이션 레이어의 컨트롤러에 부여
@Service도메인 레이어의 업무 처리에 부여
@Repository인프라 레이어의 데이터베이스 액세스 처리에 부여
@Component@Controller, @Service, @Repository의 용돟 이외의 인스턴스 생성 대상 클래스에 부여

커스텀 어노테이션

커스텀 어노테이션을 만들 때는 java.lang.Annotation 인터페이스를 상속하고 만듭니다. 또한 커스텀 어노테이션을 정의할 때는 전용 자바 파일을 생성할 필요가 있습니다.

AOP(관점 지향 프로그래밍) 의 기초 지식

AOP 예제

데이터베이스 액세스 처리에는 예외 발생 시 처리하는 내용이 반드시 포함되어야 합니다. 예외 처리를 하지 않으면 프로그램이 중지되고 자바의 경우 예외 처리를 프로그램에 포함하지 않으면 컴파일에 실패합니다.

다수의 데이터베이스 액세스 처리 코드를 작성하다 보면 예외 처리의 내용은 항상 동일하지만, 예외 처리는 필수이므로 항상 작성해야함.
구현하고 싶은 프로그램은 데이터베이스의 액세스 처리이며 예외 처리는 구현하고 싶은 프로그램에 부수적인 내용임.

AOP의 고유 용어

용어내용
어드바이스(Advice)횡단적 관심사의 구현(메서드) 로그 출력 및 트랜잭션 제어 등
애스펙트(Aspect)어드바이스를 정리한 것(클래스)
조인포인트(JoinPoint)어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드 실행 전, 메서드 실행 후 등 실행되는 타이밍
포인트컷(Pointcut)어드바이스를 삽입할 수 있는 위치, 메서드 이름이 get으로 시작할 때만 처리 하는 조건을 정의
인터셉트(Interceptor)처라의 제어를 인터셉트하기 위한 구조 또는 프로그램. 스프링 프레임워크에서는 인터셉트라는 메커니즘으로 어드바이스를 중심 관심사에 추가한 것 처럼 보이게함.
타깃(Target)어드바이스가 도입되는 대상을 의미

어드바이스 종류

어드바이스내용어노테이션
BeforeAdvice중심적 관심사가 실행되기 '이전'에 횡단적 관심사를 실행@Before
After Returning Advice중심적 관심사가 '정상적으로 종료된 후' 에 횡단적 관심사를 실행@AfterReturning
After Throwing Advice중심적 관심사로 부터 '예외가 던져진 후'로 횡단적 관심사를 실행@AfterThrowing
After Advice중심적 관심사 '실행 후'에 횡단적 관심사를 실행@After
Around Advice중앙적 관심사 호출 전 후에 해당하는 횡단적 관심사를 실행@Around

포인트컷 식

직접 어드바이스를 만든는 경우 패키지, 클래스, 메서드 등 어드바이스를 삽입 대상을 조건으로 지정할 수 있습니다. 지정하는 조건 방법에는 포인트컷 식을 사용

와일드 카드

와일드카드내용
*(애스터리스크)임의의 문자열을 나타내고, 패키지를 나타낼 때는 임의의 패키지르 한 계층을 나탬. 메서드의 인수에서는 한 개의 인수를 나타내는 반환값으로도 이용 가능
..(점 두 개)패키지를 나타내는 경우 0개 이상의 패키지를 나타냄. 메서드의 안수를 표현하는 경우에는 0개 이상의 임의의 인수를 나타냄
+(플러스)클래스명 뒤에 기술해 클래스와 그 서브클래스 및 구현 클래스 모두를 나타냄.

exection 지시자의 구현 예

구현 예내용
exectuin( com.example.service.DemoService. (..)DemoService 클래스의 메서드에 어드바이스를 적용함
exectuin( com.example.service.DemoService.select (..)DemoService 클래스의 select로 시작하는 메서드에 어드바이스를 적용
exectuin(String com.example.service.DemoService.* (..)DemoService 클래스의 반환값이 String 타입인 메서드에 어드바이스를 적용

Spring Initializr 알아보기

URL주소 : http://start.spring.io/

Spring Initializr의 이점

스프링 부트에서 프로젝트를 시작할 때 통합 개발 환경(IDE)에 의존하지 않는 프로젝트를 만드는 방법을 원한다면 Spring Initializr에서 프로젝트를 만들고 사용 중인 통합 개발 환경에서 해당 프로젝트르 가져와서 사용.

사용법

사이트 접속

라이브러리 추가

프로젝트 생성 -GENERATE를 클릭하면 프로젝트가 zip형태에 압축된 파일로 pc에 다운로드됨

프로젝트 임포트

(칼럼) 통합 개발환경(IDE)의 편리한 기능

IDE는 통합 개발 환경으로, 코딩을 편리하게 할 수 있는 기능이 포함된 환경.

  • 코드 자동 완성
    코드 자동 완성 기능을 사용하면 코딩할 때 모든 철자를 타이핑할 필요가 없으며 타이핑의 번거로움을 없애고 오타를 입력하는 실수를 방지
  • 코드 분속
    코드 분석 기능을 사용하면 오타나 문법 실수로 잘못된 코드를 입력하면 즉시 틀릭 부분을 알려줌
  • 리팩터링
    리팩터리 기능을 사용하면 수정이 필요한 클래스명이나 변수명을 프로그램 내 모든 코드에 변경 사항이 반영됨.
profile
개발블로그
post-custom-banner

0개의 댓글