본문 바로가기

WEB/SpringBoot

1. 스프링 부트 기초 개념(IoC, 어노테이션, 빈, 필터, 메세지 컨버터)

728x90
반응형

1. 스프링부트 VS 스프링: 

스프링부트는 스프링 프레임워크를 기반으로 하여 웹 애플리케이션을 개발하는데 필요한 설정을 자동화해 주는 프레임워크이다.

스프링부트는 내장형 톰캣, 제티 등을 사용하여 애플리케이션을 실행할 수 있으며, 스프링 컨테이너를 자동으로 설정하고, 톰캣의 설정, 로깅 설정, 보안 설정 등을 자동으로 처리해 준다.

 

2. 클래스 & 객체 & 인스턴스: 

Abstract Class: 인스턴스 생성이 불가능한 추상적 클래스, 하위 클래스에서 상속하여 구현(자동차 설계도)

Class: 객체의 속성 정의 및 작업 정의(자동차 공장)

Object: 클래스의 인스턴스, 클래스에서 정의된 속성 및 작업의 구체화될 객체(소프트웨어에서 구현할 Concept).(자동차라는 교통수단)

Instance: 클래스에서 생성된 실제 객체(소프트웨어에서 구현된 실체).(설계도에 따라서 자동차 공장에서 만들어진 특정 자동차)

 

3. 스프링 부트의 IoC(Inversion of control):

객체가 생성되면 객체는 heap메모리에 올라가고 객체를 가리키는 데이터는 stack 영역에 담긴다.

만들어진 객체를 호출하는 것을 개발자가 아니라 스프링부트가 관리한다.

개발자는 필요한 객체를 스프링 컨테이너에서 가져온다.

이를 구현하기 위해 스프링은 DI(Dependency Injection)라는 방식을 사용한다.

 

4. DI(Dependency Injection):

DI란, 의존성 주입을 의미하며, 객체를 생성하고 필요한 객체를 다른 객체에 주입하는 방식이다.

이를 통해 객체 간의 결합도를 낮출 수 있고, 유지보수성과 테스트 용이성이 향상된다.

어느 클래스에서도 생성된 객체를 필요에 따라 불러와서 사용할 수 있도록 한다.

 

5.  스프링부트의 필터(톰캣의 필터, 스프링 컨테이너의 필터):

스프링 부트에서 필터(Filter)는 클라이언트 요청을 서버로 보내기 전, 또는 응답을 클라이언트로 보내기 전에 중간에서 요청/응답을 가로채고 처리하는 기능이다. 

  1. 톰캣의 필터: 서블릿 컨테이너에서 제공하는 필터 기능. 클라이언트의 요청이 서블릿에 도달하기 전에 먼저 필터가 가로채어 요청/응답을 처리할 수 있다. 예를 들어, 인증/인가 처리, 로깅, 압축 등의 작업을 필터에서 처리할 수 있다.
  2. 스프링 컨테이너의 필터 스프링 컨테이너의 필터는 DispatcherServlet에서 제공하는 필터 기능이다. 톰캣의 필터와는 달리, 클라이언트의 요청이 DispatcherServlet에 도달한 후에 필터가 가로채어 처리된다. 스프링 컨테이너의 필터는 인코딩 처리, XSS 방어 등과 같은 보안 관련 작업을 처리할 수 있다.

두 종류의 필터는 각각 역할이 다르지만, 모두 클라이언트 요청/응답을 가로채어 필요한 작업을 처리하는 공통적인 기능을 가지고 있습니다. 필터를 사용하면 요청/응답을 가로채어 처리할 수 있기 때문에, 애플리케이션에서 보안, 로깅 등의 작업을 간편하게 처리할 수 있습니다.

 

6. 어노테이션(@) - 1:

스프링부트의 어노테이션은 자바 코드에 메타데이터를 추가하여 스프링부트가 런타임시 해당 코드를 어떻게 처리해야 하는지 알려준다.

대표적인 스프링부트 어노테이션으로는 @Controller, @RestController, @Service, @Repository, @Component, @Configuration, @Autowired, @RequestMapping 등이 있다.

  • @Controller: 스프링 MVC 컨트롤러로 등록하는 어노테이션.
  • @RestController: RESTful 웹서비스에서 JSON 형식으로 데이터를 반환하는 컨트롤러로 등록하는 어노테이션.
  • @Service: 비즈니스 로직을 수행하는 서비스 클래스로 등록하는 어노테이션.
  • @Repository: 데이터베이스 연동을 담당하는 DAO(Data Access Object) 클래스로 등록하는 어노테이션.
  • @Component: 스프링 콘텍스트에서 빈으로 등록하는 가장 기본적인 어노테이션.
  • @Configuration: 스프링 설정 클래스로 사용하는 어노테이션.
  • @Autowired: 의존성 주입을 수행하는 어노테이션.
  • @RequestMapping: 요청 URL을 매핑하는 어노테이션.

 

7. 어노테이션(@)-2:

  1. 컴파일 체킹: 어노테이션은 자바 컴파일러에 의해 컴파일 체킹을 받는다. 어노테이션을 사용한 코드가 컴파일 에러 없이 정상적으로 실행될 수 있도록 해야 한다.
  2. 객체 생성: 스프링부트에서 어노테이션을 사용하여 객체를 생성할 때는, 해당 어노테이션의 정보를 바탕으로 객체를 생성한다. 예를 들어, @Component 어노테이션을 사용하여 빈(Bean)을 등록할 때는, 해당 클래스의 인스턴스를 생성하여 빈으로 등록한다. 이때, 어노테이션에 지정된 속성값을 바탕으로 생성된 객체를 컨테이너에서 관리한다. 객체는 메모리의 heap영역에 올라간다.
  3. 리플렉션: 스프링부트에서는 어노테이션 정보를 바탕으로 런타임시 동적으로 객체를 생성하거나 처리할 때, 리플렉션(Reflection)을 사용한다. 리플렉션은 실행 중인 애플리케이션의 클래스 정보를 분석하여, 클래스의 인스턴스를 동적으로 생성하거나 클래스의 속성, 메서드 등에 접근할 수 있도록 한다. 스프링부트에서는 @RequestMapping, @Autowired 등의 어노테이션을 사용할 때, 리플렉션을 이용하여 런타임시 동적으로 객체를 생성하거나 속성, 메서드를 처리한다.

8. 빈(Bean):

스프링 컨테이너의 빈(Bean)은 스프링이 생성하고 관리하는 객체를 의미.

빈은 @Component, @Service, @Repository, @Controller 등의 어노테이션을 통해 스프링 컨테이너에 등록될 수 있다.

스프링 컨테이너는 빈을 생성할 때 객체의 라이프 사이클 관리, 의존성 주입(Dependency Injection), AOP(Aspect-Oriented Programming) 등을 자동으로 처리.

빈은 싱글톤(Singleton)으로 생성되어 스프링 애플리케이션 전역에서 공유.

빈의 스코프(Scope)를 지정하여 스프링 컨테이너가 빈을 생성하는 시점과 소멸하는 시점을 변경할 수도 있다.

스프링 컨테이너의 빈 개념은 객체 지향 프로그래밍의 의존성 주입(Dependency Injection) 패턴과 밀접한 관련이 있다.

빈을 통해 객체 간의 의존성을 관리할 수 있으며, 이를 통해 애플리케이션의 유지 보수성과 확장성을 높일 수 있다.

 

9. Message Converter:

Message Converter는 Java에서 사용되는 기술 중 하나로, 데이터를 다른 형식으로 변환하는 역할을 한다.

예를 들어, JSON 형식으로 작성된 데이터를 Java 객체로 변환하거나, Java 객체를 JSON 형식으로 변환할 수 있다.

Spring Framework에서는 HTTP 요청과 응답을 처리할 때 Message Converter를 사용하여 데이터 변환을 수행한다.

예를 들어, 클라이언트가 JSON 형식으로 데이터를 전송하면, Spring Framework에서는 해당 JSON 데이터를 Java 객체로 변환하여 처리할 수 있다.

 

10. JSON:

JSON은 JavaScript Object Notation의 약자로, 데이터를 표현하기 위한 경량화된 형식 중 하나.

일반적으로 웹 환경에서 데이터를 교환하는 데 사용.

JSON 데이터는 일반적으로 키-값 쌍으로 이루어져 있다.

키는 문자열로, 값은 문자열, 숫자, 불리언, 배열, 객체 등의 데이터 형식을 가질 수 있다.

특히, 객체와 배열은 중첩되어 사용할 수 있어 복잡한 데이터 구조를 표현하는 데 유용하다.

 

11. Buffered Reader & Buffered Writer:

 

자바 스프링부트에서는 입력 스트림과 출력 스트림을 다루는 데에도 다양한 기능을 제공한다.

그 중에서도 가장 기본적인 기능을 제공하는 클래스로는 BufferedReader와 BufferedWriter가 있다.

 

BufferedReader)

입력 스트림에서 문자열 데이터를 읽어 들이는 데에 사용. 이 클래스는 버퍼링된 문자 입력 스트림을 생성하여, 입력 속도를 향상하고, 문자열을 한 줄씩 읽어 들일 수 있도록 도와준다.

 

BufferedWriter)

출력 스트림으로 데이터를 출력하는 데에 사용.

이 클래스는 BufferedWriter 객체를 생성하여, 문자열 데이터를 출력할 수 있다.

또한, flush() 메소드를 제공하여, 출력 버퍼를 비우고 출력을 강제로 완료할 수 있다.

 

@ResponseBody는 자바 스프링부트에서 HTTP 응답 본문에 데이터를 직접 쓰기 위해 사용. 이 어노테이션을 사용하면 컨트롤러 메서드에서 반환한 객체를 HTTP 응답 본문에 직접 쓸 수 있다.(Buffered Writer)

 

@RequestBody는 자바 스프링부트에서 HTTP 요청 본문에서 데이터를 읽어들이기 위해 사용. 이 어노테이션을 사용하면 컨트롤러 메서드에서 HTTP 요청 본문으로부터 데이터를 읽어 들일 수 있다.(Buffered Reader)

 

 

728x90
반응형

'WEB > SpringBoot' 카테고리의 다른 글

2. 스프링부트 기초개념(JPA,ORM,영속성 컨텍스트)  (0) 2023.03.27