개인공부. Spring 기본(개념, 프로젝트 생성방법, 어노테이션 예시 몇가지)

샨티(shanti)·2022년 8월 12일
0

Study

목록 보기
4/11

8주차 과제중에 마카오 레터라는 것이 있었는데, 멘탈을 통째로 흔들어 놓기도 했고
또 새롭게 배운 Spring에 대한 이해도가 많이 낮아 퀘스트 과제를 하는 데 지레 겁을 먹었기도 했다.

마카오레터 과정에서 나온 어노테이션, 또는 프로젝트 생성 등을 정리해보고 또 공식문서도 한번 살펴보고자 한다.
다음번엔 쫄지말고 잘 해보자.

참고한 공식문서: https://docs.spring.io/spring-framework/docs/current/reference/html/index.html

정보의 홍수 속에서는 사실 공식문서만한 게 없다. 내가 영어를 못해서 문제일 뿐. -_-

스프링이란?

스프링 프레임워크. 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크. 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공
출처: 위키백과


특징

다른 프레임워크와 비교했을 때 아래와 같은 특징을 가짐

  • 경량 컨테이너로서 자바 객체를 직접 관리함. 각각의 객체 생성, 소멸과 같은 라이프 사이클(life cycle. 또는 생명주기라고도 한다)을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있음
  • 일반적인 J2EE 프레임워크에 비해 구현을 위하 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가벼움
  • 제어의 역전(IoC. Inversion of Control)을 지원함. 컨트롤의 제어권이 사용자가 아닌 '프레임워크'에 있어서 필요에 따라서는 스프링에서 사용자의 코드를 호출함
  • 의존성 주입(DI. Dependency Injection)을 지원함. 각 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜줌(!!). 아래는 의존성 주입의 장점
    (1) Dependency Reduction : 객체 상호 간 의존성 관계를 줄여준다.
    (2) Reusable Structure : 코드의 재사용과 조합이 용이하다.
    (3) Readability : 코드들이 분리되다보니 가독성이 뛰어나진다.
    (4) Loose Coupling & Easy to change : 구조는 변화에 민감하지 않을 수 있다.

그 외에도 특징들이 있으나 아직 확 와닿는 개념은 아닌 것 같아서 가져오지 않았다. 출처를 밝혀두었으니 해당 사이트에서 확인해보는 것도 좋을 것 같다.
출처: 위키백과
Spring 개념정리


주요 모듈

위키에서는 총 6개의 내용을 설명하고 있는데, 우선 강의에서 여러번 언급되었던 '모델-뷰-컨트롤러 패턴', 그리고 서칭을 하면서 몇 번 스쳐봤던 '배치(Batch) 프레임워크'를 간단히 살펴봤다.

  • 모델 뷰 컨트롤러 패턴(Spring MVC)
    스프링은 웹 프로그래밍 개발 시 거의 표준적인 방식인 Spring MVC라 불리는 모델-뷰-컨트롤러(MVC) voxjsdmf tkdydgka. DispatcherSevlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 view 서비스들로 화면에 표시될 수 있다.

길게 말이 이어져서 좀 어렵게 보이는 것 같은데 위 문장을 간략히 아래와 같이 정리할 수 있을 것 같다.

  • controller: 각종 요청을 적절한 서비스에 분산
  • Service: 요청에 대한 처리와 결과 생성
  • view: 서비스에 의해 생성된 결과를 다양한 서비스와 형태로 화면에 표시

근데 단순히 문장만 정리하고나니 그래서 MVC가 뭔가? 싶은 생각이 든다.
MVC, 즉 모델, 뷰, 컨트롤러 중심으로 정리된 블로그 글이 있어 출처를 밝히고 내용을 그대로 가져온다.

POJO란? Plain Old Java Object. 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

JSP란? JavaServer Pages. HTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹어플리케이션 도구.


  • 배치 프레임워크
    특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공. 기본적으로 스프링 배치는 Quartz 기반으로 동작함

출처: 위키백과


스프링 프로젝트 생성하기

스프링 프로젝트는 start.spring.io에서 생성할 수 있음.
만약 이 주소를 잊었다면? 스프링 프로젝트를 생성한다는 뜻의 'spring initializr' (initializer가 아님 ^^) 를 검색해서 사이트에 방문하는 방법도 있다.

다크모드를 사용하는 내 컴 기준에서 이런 화면이 첫 화면으로 등장하는데,
현재는 Gradle Project, Java Language, Jar Packaging 등의 속성을 선택하여 프로젝트를 생성한다.

Dependencies는 2개를 잡아주었는데 아래와 같다.
(1) Spring Web
(2) Spring Boot DevTools

두 개 모두 개발 편의성을 위해 여러가지 기능들을 제공해주는 것 같은데 설명을 봐도 아직은 와닿지 않고 이해는 잘 되지 않는다.
그래도 강의에서 아샬님이 이 두가지를 선택하여 프로젝트를 생성하였기 때문에 선택한 후에 Generate 버튼을 눌러 프로젝트를 생성!


어노테이션 살펴보기 전에 Application context 살짝 알고가기

스프링 컨테이너라고도 하는 Application Context는 스프링 컨테이너의 최상위 인터페이스인 BeanFactory의 하위 인터페이스이다. 즉 Accplication context는 Bean Factory에 부가 기능을 추가했다고 볼 수 있는데 기본 기능인 객체 생성과 관리 기능 뿐만 아니라 트랜잭션을 관리하고 메시지 기반 다국어 처리 등의 DI와 IoC에도 다양한 부분을 지원한다고 한다.


강의와 과제에 나왔던 어노테이션 살펴보기

동료들이랑도 우스갯 소리로 이야기했던 이름이 왜 저모냥(?)인지 심히 궁금한 ㅎㅎ 스프링 콩.. 이 아닌 스프링 빈(Bean)에 대해 잘 정리된 글이 있어 읽고 나의 언어로 다시 정리해본다.

'빈(Bean)'은 Spring IoC 컨테이너가 관리하는 자바 객체이다.
자바에서는 클래스를 생성하고 'new'로 객체를 직접 생성하여 사용했다.
예를 들면 아래와 같이...

Account account = new Account(identifier, name, amount);

그런데 이번 강의를 보고, 또 과제를 하면서도 느꼈지만 무언가 'new'를 하는 빈도수가 사알짝? 줄어든 것 같다는 생각이 들었다.
아마 그렇게까지 눈에 띄게 줄진 않았겠지만 스프링에서는 실제로 어노테이션(@. annotation)의 일부 기능을 활용하여 이 객체를 'new' 하지 않더라도 관리할 수 있도록 한다.

Spring IoC 컨테이너가 객체를 관리한다는 것이 중요한 점은 '객체의 생성'이 사용자에게 달려있는 것이 아니라. 즉 관리와 생명주기를 컨트롤 하는 주체가 사용자에게 있는 것이 아니라 관리 위임 주체에게 있다는 점이다. 결국 사용자의 제어권이 사용자가 아닌 다른 주체에게 넘어가는 것이기 때문에 이를 '제어의 역전'이라고 부르는 것이다.

스프링을 배우기 전까지 내가 알고있는 어노테이션의 종류는 아주 아주 제한적이었다.
TDD를 배우고 있는 터라 우선 @Test 어노테이션을 알고 있었고, 또 @Override 어노테이션을 알고있었다.
따지고 보면 겨우 2개...?

근데 이번주 강의가 꽤 새롭고도 어려웠다고 느꼈던 이유가 알 수 없는? 마치 외계어 같은 어노테이션이 은근히 쏟아져서 그런 것 같은데 써먹지 않고 또 잊기 전에 과제를 수행했던 코드를 함께 생각하며 복습하고자 한다.


Application.java에서 볼 수 있는 어노테이션

@SpringBootApplication
음... 솔직히 말하면 이 어노테이션은 내가 직접 작성해주는 어노테이션이 아니라
스프링 프로젝트를 생성한 뒤 실행하면 이미 생성되어 있는 'Application.java'라는 파일에 이미 붙어있던 거라 크게 신경쓰지 않았었다.
하지만 이번에 어노테이션을 하나씩 살펴보면서 아! 이런 어노테이션도 있었구나를 다시한번 깨닫게 되었다.

간단하게 이 어노테이션은 '자동 설정'을 해주기 위한 어노테이션으로 고유 어노테이션인 3가지가 기본으로 들어가있는데 이 3가지를 살펴보는 것이 은근히 재미있었다.
비록 우리 눈에 노출되는 어노테이션은 @SpringBootApplication 한줄이었지만 그 속을 타고 들어가보니 이 어노테이션으로 인하여 이런 부분들이 가능했구나~를 살짝 알 수 있게 되었다.

실제로 커맨드 + 클릭을 누르니 또다른 어노테이션들을 볼 수 있었는데 좀 더 살펴보려는 어노테이션은 아래 세가지이다. 사실 이 @SpringBootApplication 어노테이션은 아래 3가지의 어노테이션을 제공하는 것과 같은 의미라고도 할 수 있겠다.

@SpringBootConfiguration

@EnableAutoConfiguration
미리 정의되어 있는 빈(Bean)들을 가져와서 등록해준다.
기본 설정되어 있는 빈들은 외부라이브러리(External Libraries) 중 spring-boot-autoconfigure에 정의되어 있다.

이런 어노테이션들의 읨리르 몰랐을 땐 '도대체 스프링이 나 대신 뭘 해준다는거지?'라는 의문이 있었는데 이제는 그런 의문이 뭔가 눈녹듯 사라졌다;;
이 객체를 스프링이 자동으로 관리해주지 않는다면 모~~두, 내가 관리해주고, 사용처를 정하고, 그 사용처에서 생성을 하거나 의존성 주입을 시켜주고, 연동을 시키고.. 어휴 머리아파.

@ComponentScan
현재 패키지 이하에서 @Component 어노테이션이 붙어있는 클래스들을 찾아 빈(Bean)으로 등록해주는 역할을 한다. (어노테이션에 모양새에서도 벌써 느껴진다.)
근데, @Configuration이나 @controller와 같은 어노테이션도 막상 내부에서 확인해보면 @Component 어노테이션을 가지고 있는것을 확인할 수 있다.
그렇다면? 겉으로 보이는 모양새로는 얘가 컴포넌트 어노테이션을 갖고 있는지 아닌지 명확히 알 수 없다는 점...
그럼 내부적으로 @Component를 가진 어노테이션들은 또 뭐가 있을까...?

우선 이 컴포넌트스캔이 진행되면 @Configuration, @Bean, @Component의 하위 어노테이션들(@Repository, @Service, @Controller, @RestController, @ControllerAdvice, @RestControllerAdvice)을 스캔한다. 결국 이 어노테이션들을 찾아들어가면 컴포넌트 어노테이션을 확인할 수 있다는 이야기!


@Componenet, @Bean의 차이

잠깐 딴 길로 새기.

@Component@Bean의 용도가 다른데, 컴포넌트는 개발자가 직접 작성한 class를 빈으로 만드든 것이고.
빈은 개발자가 작성한 method를 통해 반환되는 객체를 빈으로 만드는 것이라고 한다. 개발자가 제어 불가능한 외부 라이브러리 등을 컨테이너에 등록하려 할 때 빈을 사용한다고 한다.(ArrayList 같은 라이브러리를 빈으로 등록하려는 것이 그 예가 될 수 있겠음)

또한 @Component를 사용한 Bean의 의존성 주입은 @AutoWired 어노테이션을 이용하여 실현이 가능하다.


Test 파일에서 볼 수 있는 어노테이션

TDD 방식을 학습하다 보니 Test 파일은 필수로 생성 ㅎㅎ Test 파일에서 보았던 어노테이션들을 간략히 정리해봤다.

@WebMvcTest
MVC를 위한 테스트. 컨트롤러가 예상대로 작동되는지를 테스트 하기 위해 사용된다.
아.. 지금 생각하니 정말 컨트롤러 클래스 이외에는 이 어노테이션이 붙지 않았는데...
아무 생각 없이 쓰고있는 이 어노테이션. 뜻을 모른다면 이렇게 나중에서야 깨닫는 불상사가 생긴다.
클래스 명 위에 해당 어노테이션을 붙이면 된다.

@Autowired
@Autowired 어노테이션의 경우 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당한다.
강의에서도 컨트롤러 테스트 시 무지성으로 썼었던 모양새가 아래와 같다.

@Autowired
	private MockMvc mockMvc;

내용을 좀 더 추가하고 싶은데, 새벽 4시를 향해가는 시간이라 너무 졸려서...ㅎㅎ
다음번엔 아래 내용을 이어서 추가해보고자 한다.

@SpyBean
MockBean
@GetMapping
@PostMapping
@RequestParam
@PathVariable

참고
[Spring Boot] @SpringBootApplication 파헤치기
Spring Boot의 Config Annotation에 대해 알아보자
[Spring] @Autowired 와 DI 개념 정리
[코딩젤리:티스토리]

코딩창고:티스토리

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글