커리어리에서 어느 개발자분이 올려주신 글인데 신입 개발자가 꼭 알아야할 Spring 기초 지식들이라고한다.
여러가지 Spring 프로젝트도 진행해보았고 예전에 공부도 다 한내용이였지만 기억이 나지않아 다시한번 정리해보려고 한다.
오늘은 인스턴스, 객체, Web Server, WAS, IoC 컨테이너, Bean, AOP에 대해 정리해 보도록 하겠다.
오로지 나 혼자 블로그와 강의를 보며 공부한 내용이며, 틀린 내용이 있을 수 있음!
객체는 먼저 데이터와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념이다.
예를 들어 기차역에서 승차권을 발매하는 경우, 실체인
손님
과 동작인승차권 주문
은 하나의 객체이다. 실체인역무원
과 동작인승차권 발매
도 하나의 객체이다. 같은 성질(구조와 형태)을 가지는 객체는 등급으로 정의하고, 같은 등급에 속하는 객체는 그 등급의 인스턴스라고 한다.
인스턴스는 객체에 메모리를 할당하고 실제 사용될 때 인스턴스라고 부른다. 이전에 선언만 된건 객체라고 부르게 된다.
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
이렇게 선언만 됐을땐 객체, 메모리에 할당했을땐 인스턴스라하며 저 과정을 인스턴스화라고한다.
HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저에서 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버
Apache, NginX, IIS 등이 존재한다. 보통 정적웹에서 사용한다. 정적웹이란 페이지 안에 내용들이 바뀔 일이 없는것이다.
예를들어 고정된 HTML과 CSS 등이있다.
WAS(Web Application Server)는 DB 조회 혹은 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application 서버이다.
Tomcat이 Spring에서 대표적인 WAS이며, 보통은 동적 웹에서 사용한다. 동적웹이란 페이지 안에 내용들이 변화하는것을 말한다.
이런 구조로 이루어져 있는데, 쉽게 설명하자면 Web Server는 정적 컨텐츠만 제공하는 서버인데, Web Server가 동적 컨텐츠를 요청 받으면 WAS에게 해당 요청을 넘겨주고 WAS가 동적 컨텐츠를 대신 처리하도록 되어있다는것이다.
정적 처리는 보통 Web Server에게 시키고 동적 처리는 WAS에게 넘겨 서버의 과부화를 방지한다.
때문에 Web Server와 WAS를 같이 사용해야한다.
IoC 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는것이다. 스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데, 그것이 바로 IoC 컨테이너(스프링 컨테이너) 이다.
먼저, 스프링 컨테이너는 두가지 종류가 존재한다.
이렇게 두가지중 나는 여태 DI를 많이 사용해왔다.
@Component
, @Bean
이렇게 두가지를 이용해 IoC 컨테이너에 Bean을 등록하고 컨테이너가 객체의 생명주기를 자동으로 관리해 주도록 할 수 있다.
이 외에도 @Service
, @Configuration
, @Controller
, @Repository
등을 사용할 수 있지만 이 어노테이션들은 기본적으로 @Component
를 가지고 있는 어노테이션들이라 같은 기능을 수행한다.
여기서 주의해야할것은 @Configration
이다. Bean을 등록할때 다른 어노테이션들은 클래스 단에 어노테이션을 작성하지만, @Configuration
만 신기하게 클래스 단에는 @Configuration
을 작성하고 나머지 메소드에는 @Bean
을 각각 등록해줘야한다. Configuration이 기본 설정파일을 명시하는것이고, 메소드를 이용해 기본 설정을 진행하는 느낌이라 그런가 이 클래스 안에 이 메소드! 라고 경로를 알려주는 느낌인것 같다.
예제 코드하나 보겠다.
@Configuration
public class EncoderConfig {
@Bean
public BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}
내가 실제로 비스크립트를 이용해 암호화하기 위해 설정했던 Config 파일이다. 여기서도 보면 클래스 단에 Configuration 어노테이션을 작성하고 Bean을 메소드 단에 작성하는걸 볼 수 있다.
나는 근데 여기서 공부를 하다보니 이상한점을 하나 발견했다. IoC 컨테이너는 분명 객체의 주기를 관리해주는것이라 했고, 그 컨테이너에 등록된 객체는 Bean이라고 부른다 했다. 여기서!! @Component와 @Bean들은 클래스와 메소드 단에 사용하는게 아니야? 왠 객체?!?! 라는 의문점을 가지게 되었다.
내가 오개념을 가지고 있는 건지 모르겠지만, 공부해본 바로는 클래스와 메소드도 그냥 객체로 사용된다는것이다.
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
private final BoardImageRepository boardImageRepository;
private final CoordinatorRepository coordinatorRepository;
}
이렇게 자동주입 어노테이션을 통해 Repository들을 객체로 만들어 사용하긴했다....ㅎㅎ 이걸 까먹고 약간 삽질(?)한 느낌이였다..ㅎㅎㅎㅎ
빈은 위에서도 설명했지만 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈을 관리한다. 빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
원래 JAVA는 유명한 커피회사의 이름이였고 Bean은 커비콩을 의미한다고한다. 커피콩이 모여 커피가 되듯이!! 약간 재미있는 이름 같았다.
AOP는 간단하게 말해 핵심 로직과 부가 기능을 분리해 모듈화하여 재사용 할 수 있도록 지원하는것이다.
내가 생각하기엔 FE에서도 컴포넌트를 사용해 재사용 하듯이 AOP도 그런 기능을 하지 않을까? 싶지만 AOP는 어플리케이션의 다양한 부분에서 동작하고 있는 부가 기능을 효과적으로 관리하고 모듈화하는 데 사용되며, FE에서의 컴포넌트 사용과는 다른 컨셉이라고 한다....