#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

09장: 애플리케이션 만들기

 

1. OX 퀴즈

1) 기능 목록

- 등록 기능, 갱신 기능, 삭제 기능, 목록 표시 기능, 게임 기능

2) URL 목록

- GET, /quiz: 퀴즈 목록을 표시

- POST, /quiz/insert: 등록 처리를 실행

- GET, /quiz/{id}: 갱신 화면을 표시

- POST, /quiz/update: 갱신 처리를 실행

- POST, /quiz/delete: 삭제 처리를 실행

- GET, /quiz/play: 퀴즈 화면을 표시

- POST, /quiz/check: 퀴즈 답을 체크

 

2. 레이어

1) 애플리케이션 레이어

- 클라이언트에서 받은 요청을 제어하고 도메인 레이어를 사용하여 애플리케이션을 제어.

- Controller: 요청을 처리에 매핑하고 결과를 뷰에 넘겨주는 제어를 함. 주요 처리는 Controller 안에서 실행하지 않고 '도메인 레이어'의 Service를 호출.

- Form: 화면의 폼을 표현. 입력한 값을 Controller에 넘겨주며, Controller에서 화면에 결과를 출력할 때도 사용. 도메인 레이어가 애플리케이션 레이어에 의존하지 않도록 Form에서 도메인 객체로 변환하거나 도메인 객체에서 Form으로 변환하는 것을 애플리케이션 레이어에서 수행.

- View: 화면 표시를 담당.

2) 도메인 레이어

- 도메인 객체에 대해 애플리케이션의 서비스 처리를 실행.

- Entity: 서비스 처리를 실행할 때 필요한 자원.

- Service: 애플리케이션의 서비스 처리를 담당.

- Repository: 인터페이스. 데이터베이스의 데이터 조작 내용만 정의(구현 내용은 작성하지 않음).

3) 인스라스트럭처 레이어

- 도메인 객체에 대해 CRUD 조작을 해서 데이터의 영속화를 담당.

- Repositorylmpl: 도메인 레이어에서 정의한 Repository의 구현 클래스.

- O/R Mapper: O(Object; 객체)와 R(Relational; 관계형 데이터베이스) 간의 데이터를 매핑

 

3. 데이터베이스/프로젝트 생성

1) dependencies

- Spring Boot DevTools: 스프링 부트 개발 툴. 자동 재실행 등 개발에 편리한 기능 포함.

- Lombok: 어노테이션을 부여하는 것으로 getter와 setter 등을 코드로 작성하지 않아도 자동으로 구현해줌.

- Spring Data JDBC: 스프링 데이터에서 제공하는 OR Mapper.

- Validation: 유효성 검사 기능인 'Bean Validation'과 'Hibernate Validator'를 사용할 수 있게 함.

- Thymeleaf: 스프링 부트에서 추천하는 템플릿 엔진

- Spring Web: 스프링 MVC

테이블 생성

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

08장: 유효성 검사 기능 알아보기

1. 유효성 검사

- 입력 내용이 요건에 만족하는지 그 타당성을 확인

- 단일 항목 검사/상관 항목 검사

1) 단일 항목 검사

- 입력 항목 하나에 대해 설정하는 입력 체크 기능

- @NotNull, @Max, @Size, @AssertTrue, @Past, @Valid, @Length, @Email, @URL 등

2) 커스텀 유효성 검사

- 여러 필드에 대해 혼합해서 체크하는 것

- 상관 항목(서로 관련이 있는 항목) 검사

- Bean Validation 사용, 스프링 프레임워크 Validator 인터페이스 구현

 

2. 단일 항목 검사 프로그램 만들기

- HTML의 <form> 태그에 바인딩되는 Form 클래스 인스턴스를 'form-backing bean'이라고 부르고 @ModelAttribute 어노테이션을 사용해 연결

- @Validated 어노테이션을 부여한 클래스와 BindingResult 인터페이스를 함께 인수로 사용하고 반드시 @Validated -> BindingResult 순으로 사용

- messages.properties는 '키=값'의 형태로 프로퍼티 정의

 

3. 커스텀 유효성 검사기를 사용하는 프로그램 만들기

- 스프링 프레임워크가 제공하는 Validator 인터페이스를 구현하는 커스텀 유효성 검사기 생성

- 컨트롤러에 앞에서 만든 커스텀 유효성 검사기를 주입(인젝션)하고 WebDataBinder 인터페이스의 addValidators 메서드로 커스텀 유효성 검사기를 등록하여 스프링 MVC에서 이용할 수 있게 하기

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

07장: 요청 파라미터 취득하기

1. 요청 파라미터(request parameter)

- 서버에 전송되는 값

- 취득 방법: @RequestParam 사용, Form 클래스 사용

- 하나의 뷰에 버튼이 여러 개 있을 때 어느 버튼이 클릭되어 요청이 보내졌는지를 식별해야 하는 경우 사용되는 것이 '요청 매핑(RequestMapping)' 어노테이션의 'params 속성'

 

2. 입력값을 받는 프로그램 만들기(@RequestParam)

1) 컨트롤러와 뷰 생성

- controller 패키지 생성, RequestParamController 클래스 생성

- 뷰 생성(입력화면)

- 컨트롤러에 요청 핸들러 메서드 추가

- 뷰 생성(확인 화면)

- http://localhost:8080/show

- @RequestParam 어노테이션은 편리하지만, 요청 파라미터를 하나씩 인수로 받기 때문에 입력 항목이 늘어날수록 인수도 함께 늘려야 하므로 확장성에 문제 발생

 

3. 입력값을 받는 프로그램 만들기(Form 클래스)

1) Form 클래스 생성

2) 뷰 생성(확인 화면: Form 클래스 사용)

 

4. URL에 포함된 값을 받는 프로그램 만들기

1) 컨트롤러 생성

2) 뷰 생성(입력 화면)

- 컨트롤러에 추가(링크 처리)

3) 뷰 생성(기능 화면)

- 컨트롤러에 추가(버튼 판별 처리)

4. 뷰 생성(버튼 클릭 확인 화면)

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

05장: MVC 모델 알아보기

1. MVC 모델

- 프로그램의 처리 역할을 나누어서 프로그램을 작성하는 방법

- 모델(Model): 비즈니스 로직 담당, 시스템의 코어 부분, 시스템의 목적을 처리하는 부분

- 뷰(View): 사용자 입력과 결과 출력 등 시스템에서 표현 부분을 담당

- 컨트롤러(Controller): 서비스 처리를 담당하는 모델과 화면 표시를 담당하는 뷰를 제어하는 역할, 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달

- 장점: 역할 분담을 통해 효율적인 개발 가능, 개발하는 엔지니어의 분업화가 용이, 설계 변경에 유연하게 대응 가능

 

2. 스프링 MVC

- 웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크

1) 주요 구성 요소

- DispatcherServlet: 모든 요청을 수신하는 프런트 컨트롤러

- Model: 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체

- 컨트롤러: 요청에 대응해서 처리할 내용이 있는 곳

- 서비스 처리: 데이터베이스에 접속해서 데이터를 취득하거나 데이터를 가공하는 등 여러 가지 작업을 실행. 개발자가 설계하고 구현(스프링 MVC와 관계없음)

- 뷰: 화면 표시 처리

 

@Controller: 클라이언트와 데이터 입출력을 제어하는 애플리케이션 레이어의 컨트롤러를 부여

@RequestMapping: 컨트롤러의 요청 핸들러 메서드와 URL을 매핑

@GetMapping: @RequestMapping의 GET 요청용 어노테이션

@PostMapping: @RequestMapping의 POST 요청용 어노테이션

 

3. 뷰 생성 규칙

- resources/templates 폴더 밑에 뷰를 생성

- 뷰가 많이 필요한 경우에는 기능별로 폴더를 만들어서 보관

- 폴더를 나눈 경우는 templates 폴더 이하의 폴더명을 요청 핸들러 메서드의 반환값에 지정

- CSS나 자바스크립트 등은 resources/static 폴더에 배치

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

04장: 데이터베이스 작업

  1. 데이터베이스/테이블
  1. 관계형 데이터베이스(Relational Database)
  • 데이터를 표 형식으로 표현하고, 여러 표에서 항목의 값 사이에 관계를 맺고 있는 데이터베이스
  1. 레코드와 칼럼
  • 테이블의 가로 행(row)을 레코드(record)
  • 하나의 레코드가 한 건의 데이터
  • 테이블의 세로 열(column)을 칼럼(column)
  1. 데이터 입력
  1. SQL(Structured Query Language, 구조화 질의어)
  • 데이터베이스를 조작하기 위한 언어
  • CRUD: 영속적으로 데이터를 취급하는 4개의 기본적인 기능(생성, 읽기, 갱신, 삭제)
  • SQL의 CRUD

CRUD 명령어 개요

생성(Create) INSERT 데이터를 등록
읽기(Read) SELECT 데이터를 참조
갱신(Update) UPDATE 데이터를 갱신
삭제(Delete) DELETE 데이터를 삭제
  1. 엔티티와 리포지토리 알아보기
  1. 엔티티
  • 데이터를 담아두는 객체
  • 데이터베이스 테이블의 한 행(레코드)에 대응하는 객체
  1. 리포지토리
  • 데이터베이스를 조작하는 클래스
  • 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 함
  1. 스프링 데이터 JDBC 사용해보기
  1. JDBC
  • O/R 매퍼
  • 스트링 데이터가 제공하는 CrudRepository를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있음

<롬복에서 제공하는 어노테이션>

@Data: 클래스에 부여하는 것으로, 전 필드에 대해 getter/setter로 액세스할 수 있음. hashCode(), equals(), toString()도 자동 생성

@NoArgsConstructor: 클래스에 부여하는 것으로, 기본 생성자가 자동 생성됨

@AllArgsConstructor: 클래스에 부여하는 것으로, 전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성됨

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

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

 

1.  의존성 주입(DI)

- 의존하는 부분을 외부에서 주입하는 것

1) 클래스 의존(구현 의존)

- '사용하는 객체' 클래스에서 '사용되는 객체' 클래스의 타입을 직접 지정해 버리면 '사용되는 객체' 클래스를 변경할 경우 이를 이용하고 있는 곳을 모두 수정해야 함

- 수정할 부분이 늘어나면 실수가 발행할 위험과 시간이 늘어남

2) 인터페이스 의존

- 참조를 받는 유형으로 사용할 수 있으므로 변수의 이름을 변경하지 않아도 됨

- 인터페이스가 선언된 메서드를 이용하면 클래스가 바뀌어도 메서드명을 변경하지 않아도 됨

- 클래스 의존보다 인터페이스 의존을사용하는 것으로 수정할 곳을 줄일 수 있음

 

2. 관점 지향 프로그래밍(AOP)

1) 중심적 관심사(Primary Concern)

- 실현해야 할 기능을 나타내는 프로그램

2) 횡단적 관심사(Crosscutting-Concerns)

- 본질적인 기능은 아니지만 품질이나 유지보수 등의 관점에서 반드시 필요한 기능을 나타내는 프로그램

- 예외처리, 로그 정보 화면이나 파일 등으로 출력 처리, 데이터베이스의 트랜잭션 제어 등

 

3. DI 컨테이너 다섯 가지 규칙

1) 인터페이스를 이용하여 의존성을 만든다

- 의존하는 부분에 인터페이슬르 이용한다는 것

2) 인스턴스를 명시적으로 생성하지 않는다

- 인스턴스 생성에 new 키워드를 사용하지 않는다는 것

3) 어노테이션을 클래스에 부여한다 & 4) 스프링 프레임워크에서 인스턴스를 생성한다

- 인스턴스를 생성하려는 클래스에 인스턴스 생성 어노테이션을 부여한다는 것

- @Controller: 인스턴스 생성 지시, 스프링 MVC를 이용할 때 컨트롤러에 부여

- @Service: 인스턴스 생성 지시, 트랜잭션 경계가 되는 도메인(서비스) 기능에 부여

- @Repository: 인스턴스 생성 지시, 데이터베이스 액세스(리포지토리) 기능에 부여

- @Component: 위 용도 이외의 클래스에 부여

5) 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다

- 스프링 프레임워크에 의해 생성된 인스턴스를 이용하는 클래스에 참조를 받는 필드를 선언하고 필드에 @Autowired 어노테이션 부여

 

4. DI 프로그램 만들기

// 인사 인터페이스
public interface Greet {

    // 인사하기
    void greeting();
    
}
// Greet 구현 클래스, 아침 인사 하기
@Component
public class MorningGreet implements Greet{
    @Override
    public void greeting(){
        System.out.println("-------------");
        System.out.println("좋은 아침입니다");
        System.out.println("-------------");
    }
}
//스프링부트 시작 클래스
@SpringBootApplication
public class BookstudyApplication {

    //메인 메서드: 자신의 execute 메서드를 호출하도록 작성
    public static void main(String[] args) {
        SpringApplication.run(BookstudyApplication.class, args)
                .getBean(BookstudyApplication.class).execute();
    }

    //주입하는 곳(인터페이스)
    @Autowired
    Greet greet;

    //실행 메서드
    private void execute(){
        greet.greeting();
    }
}

 

[소스코드 설명]

- 스프링 프레임워크는 기동 시 컴포넌트 스캔에 의해 MorningGreet 클래스에 @Component 어노테이션이 부여되어 MorningGreet 인스턴스가 생성됨

- @Autowired 어노테이션에 따라 MorningGreet 클래스의 인스턴스가 클래스의 greet 필드에 주입되어 실행되면 MorningGreet 클래스의 getting 메서드가 실행됨

 

[요약]

- 스프링 프레임워크는 임의로 구현한 클래스를 인스턴스화하는 기능을 제공(DI 컨테이너)

- 스프링 프레임워크를 사용하는 애플리케이션은 인스턴스를 명시적으로 생성하지 않음(new 키워드를 사용하지 않음)

- 정해진 어노테이션(@Component)을 클래스에 부여하는 것으로 스프링 프레임워크가 인스턴스를 생성

- 생성된 인스턴스를 사용하고 싶은 부분에서 필드를 준비하고 주석(@Autowired)을 부여하면 스프링 프레임워크가 인스턴스가 필요한 것으로 판단하고 인스턴스를 주입

- 인스턴스를 이용해서 의존성을 만들고 DI를 사용하여 '사용되는 객체' 클래스를 변경하는 경우 '사용하는 객체' 클래스의 수정 없이 변경할 수 있음

 

5. 어노테이션

1) 도메인 주도 설계 레이어

- Application Layer: 클라이언트와 데이터의 입출력을 제어하는 레이어

- Domain Layer: 애플리케이션의 중심이 되는 레이어로서 업무 처리를 수행하는 레이어

- Infrastructure Layer: 데이터베이스에 대한 데이터 영속성 등을 담당하는 레이어

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

- @Controller: 애플리케이션 레이어의 컨트롤러에 부여

- @Service: 도메인 레이어의 업무 처리에 부여

- @Repository: 인프라 레이어의 데이터베이스 액세스 처리에 부여

- @Component: 하위 로직을 처리할 때 사용

 

6. 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)

- 프로그램을 '중심적 관심사'와 '횡단적 관심사' 2개의 요소로 구성되어 있다고 생각

- AOP는 본질적인 기능은 아니나 꼭 필요한 기능인 횡단적 관심사를 분리함으로써 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능(공통 처리)을 추가할 수 있음

1) AOP 고유 용어

- Advice, Aspect, JoinPoint, Pointcut, Interceptor, Target

2) 어드바이스의 다섯 가지 어노테이션 종류

- @Before, @AfterReturning, @AfterThrowing, @After, @Around

3) 포인트컷 식

- 직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있음

- 지정하는 조건 방법에는 포인트 컷 사용

- execute(반환값 패키지.클래스.메서드(인수))

package me.yuan.bookstudy.used.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

@Aspect //어드바이스를 기술하는 클래스
@Component  //인스턴스 생성
public class SampleAspect {

    @Before("execution(* me.yuan.bookstudy.used.*Greet.*(..))")     //메서드 실행 전에 호출
    public void beforeAdvice(JoinPoint joinPoint) {
        //시작 부분 표시
        System.out.println("=== Before Advice ===");
        //날짜를 출력
        System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
        //메서드 이름 출력
        System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
    }

    @After("execution(* me.yuan.bookstudy.used.*Greet.*(..))")      //메서드 실행 후에 호출
    public void afterAdvice(JoinPoint joinPoint) {
        //시작 부분 표시
        System.out.println("=== After Advice ===");
        //날짜를 출력
        System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
        //메서드 이름 출력
        System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
    }

    @Around("execution(* me.yuan.bookstudy.used.*Greet.*(..))")     //메서드 실행 전후에 호출
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        //시작 부분 표시
        System.out.println("=== Arou줌d Advice ===");
        System.out.println("*** 처리전 ***");
        //지정한 클래스의 메서드 실행
        Object result = joinPoint.proceed();
        System.out.println("*** 처리후 ***");
        //반환값을 돌려줄 필요가 있는 경우에는 Object 타입의 반환값을 돌려줌
        return result;
    }
}

 

4) Around Advice와 다른 어드바이스와의 차이

- 인수는 ProceedingJoinPoint 인터페이스 타입을 지정

- 어드바이스 중에서 ProceedingJoinPoint 인터페이스의 proceed() 메서드를 호출

- 어드바이스 적용 대상의 메서드를 임의의 타이밍으로 호출할 수 있으므로 전후로 다양한 처리가 가능

 

7. @Transactional

- 트랜잭션 관리에 사용하는 어노테이션

- 데이터베이스 액세스 처리 메서드가 정상 종료하면 트랜잭션을 커밋하고 예외가 발생하면 롤백

 

 

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

02장: 기초 지식 배우기

 

1. 인터페이스

- 자바에서 클래스에 포함하는 메서드의 구체적인 내용을 작성하지 않고 상수와 메서드 타입만 정의한 것

1) 인터페이스 선언

- interface 키워드 사용

- public abstract 암묵적 접근 제어자

public interface Greet {
    /**
     * 인사하기
     */
    public abstract void greeting();
}

2) 인터페이스 구현

- implements 키워드 사용

- 인터페이스로 정의되는 추상 메서드를 모두 구현할 필요가 있어 구현하지 않는 경우에는 컴파일 에러 발생

- 구현 시 public 선언 필요

- @Override:슈퍼 클래스나 인터페이스의 메서드를 상속 혹은 구현하는 클래스에서 재정의하는 것

public class MorningGreet implements Greet{
    @Override
    public void greeting(){
        System.out.println("좋은 아침입니다");
    }
}

 

2. 리스트

1) 컬렉션(Collection): 복수의 데이터를 더 쉽게 사용할 수 있는 클래스

- 리스트(List): 순서대로 데이터를 저장, 데이터의 중복을 허용

- 세트(Set): 순서를 유지하지 않는 집합, 중복을 허용하지 않음

- 맵(Map): 키와 값의 쌍으로 이루어진 데이터 집합, 순서는 유지되지 않고 키의 중복을 허용하지 않으며 값의 중복을 허용

2) 리스트 개요

- 컬렉션 프레임워크에서 제공하는 인터페이스

- ArrayList: 요소를 배열로 유지하기 때문에 요소의 검색을 고속으로 처리할 수 있지만, 요소의 수가 많아지면 추가/삭제를 처리하는 데 시간이 걸림

- LinkedList: 요소끼리 전후 양방향의 링크를 참조하는 리스트 구조를 이용해 관리하기 때문에 요소의 추가나 삭제 ArrayList보다 빠름, 그러나 특정 요소 검색과 같은 인덱스 값에 의한 무작위 액세스에는 적합하지 않음

 

3. 클라이언트와 서버

- 클라이언트: 서비스를 요청하는 쪽

- 서버: 서비스를 제공하는 쪽

 

4. 브라우저

- 인터넷을 사용할 때 이용하는 소프트웨어

- 크롬, 파이어폭스, 사파리 등

 

5. 애플리케이션

- 응용 프로그램 소프트웨어의 약어

- 프로그래밍 언어로 작성한 소프트웨어

 

6. 웹 서버

- 웹 애플리케이션을 배포하는 서버

- 웹 서버는 항상 실행되며 클라이언트로부터 액세스(요청)을 계속 기다림

 

7. HTTP 통신(프로토콜)

- 클라이언트와 웹 서버는 HTTP 요청(request)와 HTTP 응답(response)으로 상호작용

- HTTP 통신의 흐름: 클라이언트가 브라우저에 URL 입력 → 클라이언트에서 웹 서버로 HTTP 요청이 전송됨 → 웹 서버는 HTTP 요청에 해당하는 HTTP 응답을 클라이언트에게 반환 → 브라우저는 받은 응답을 표시하고 클라이언트가 이를 확인

 

8. GET 메서드와 POST 메서드

- HTTP 요청의 한 유형

1) GET 메서드

- 브라우저에서 웹 서버로 값을 전달할 때 URL 뒤에 값을 더하여 보내는 방식

- URL 뒤에 오는 정보를 '쿼리 스트링' 또는 '쿼리 문자열'이라고 함

2) 쿼리 스트링의 특징

- URL 끝에 '?'가 붙어 쿼리 스트링의 시작을 나타냄 (예: domain.com/?)

- 형식은 '이름=값' (예: domain.com/?name=value)

- 여러 값을 전달하려면 '&'로 연결 (예: domain.com/?name=value&tel=010)

3) POST 메서드

- 브라우저로부터 웹 서버에 값을 보낼 때 '요청 본문(request body)'이라고 하는 URL에는 보이지 않는 장소에 값을 넣어서 보내는 방법

- 개인정보 등의 내용을 URL에 표시하고 싶지 않을 때 사용

- 많은 양의 값을 보내는 데 적합

 

#참고도서: '스프링 프레임워크 첫걸음' (키노시타 마사아키, 위키북스)

 

01장: 스프링 프레임워크 알아보기

 

1. 프레임워크(framework)

- 소프트웨어나 애플리케이션 개발을 간단하게 해주는 뼈대

- 장점: 개발에 필요한 기본 기능을 제공하여 자신이 모든 기능을 작성할 필요가 없어 시간 및 비용 절약 가능

- 단점: 프레임워크 고유 사용법 이해 필요

 

2. 스프링 프레임워크

- 자바 개발 환경에서 사용되는 프레임워크

1) 스프링 부트(Spring Boot)

- 스프링 애플리케이션을 복잡한 설정 없이 빠르게 작성하는 기능 제공

2) 스프링 프로젝트

- 스프링 MVC: 웹 애플리케이션을 간단하게 생성하는 기능 제공

- 스프링 데이터: 데이터 접근에 관한 기능 제공

- 스프링 배치: 배치 처리 기능 제공

- 스프링 시큐리티: 인증/허가 기능 제공

3) 스프링 코어

- 스프링 DI: 의존성 주입(Dependency Injection) 기능 제공

- 스프링 AOP: 관점 지향 프로그래밍(Aspect Oriented Programming) 기능 제공

 

 

+ Recent posts