Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Spring boot todo 프로젝트 세팅 본문

DEV&OPS/Java

Spring boot todo 프로젝트 세팅

ALEPH.GEM 2022. 8. 26. 14:04

스프링 부트(Spring boot)

기존 스프링 프레임워크는 세팅이 매우 복잡하기 때문에 세팅을 자동으로 해주는 스프링 부트가 등장했습니다.

스프링 부트 덕분에 Stand-alone 어플리케이션을 쉽게 구동가능해졌습니다.

기존에는 자바 웹 어플리케이션을 WAR 파일로 압축해서 WAS에 배포했었고 다수의 WAR 파일을 동시 구동할 수 있어서 stand-alone이 아닙니다.

스프링 부트는 내장된 임베디드 WAS(tomcat, jetty 등)로 구동하게 됩니다.

IDE 는 전자정부프레임워크 4.0 이상이나 STS 에서 스프링 부트를 지원합니다.

 

 

DispatcherServlet

기존 웹 어플리케이션 개발은 HttpServlet을 상속하는 클래스를 만들고 doGet()이나 doPost()메서드를 구현하고 HttpServletRequest에서 매개변수를 추출하고 비지니스 로직(process)를 실행하고 반환될 정보를 HttpServletResponse에 담아서 반환합니다.

이 때, 비지니스 로직을 제외하고 나머지 작업들은 반복해서 해야하는 작업이기 때문에 이 반복작업을 대신 해주는 서블릿이 DispatcherServlet입니다.

이 DispatcherServlet은 스프링 부트에 이미 구현이 되어 있어 개발자는 비지니스 로직에 집중하면 됩니다.

@RestController  //JSON을 리턴하는 서비스임을 명시
public class HelloController{
    @GetMapping("/test")  //URI path설정, GET방식 메서드
    public String process(@RequestParam String name){
        //비지니스 로직
        return "test" + name;
    }
}

스프링 프레임워크를 사용하면 아래와 같은 장점이 있습니다.

1. HttpServlet을 상속하지 않아도 됩니다.

2. doGet을 오버라이드 하지 않아도 됩니다.

3. HttpServletRequest를 직접 파싱하지 않아도 됩니다.

4. HttpServletResponse를 작성하지 않아도 됩니다.

 

 

샘플 스프링 부트 프로젝트 설정

앞으로의 예제에서 사용하기 위한 프로젝트를 설정해보겠습니다.

https://start.spring.io/

위 툴을 이용해서 원하는 라이브러리를 선택한 후 프로젝트를 생성해줍니다.

  1. Project : 빌드 툴을 선택합니다. Gradle을 사용하겠습니다.
  2. Language : 프로그래밍 언어를 선택합니다. JAVA를 선택하겠습니다.
  3. Spring boot : 스프링 부트 버전을 선택합니다. 2.6.12(SNAPSHOT) 을 선택하겠습니다.
  4. Project Metadata : Group과 Artifact는 프로젝트를 배포할 때 프로젝트 메타 정보를 나타냅니다. 우리는 public repository에 배포하지 않으므로 기본 값으로 합니다. Packaging에는 Jar를 선택하고 자바 버전은 8을 사용하겠습니다.
  5. Dependencies : Spring Initializer에서는 필요한 디펜던시를 추가할 수 있습니다. maven에서는 pom.xml을 사용하지만 gradle에서는 디펜던시가 build.gradle 이라는 파일에 추가됩니다. 여기서는 Spring Web, Spring Data JPA, H2 Database, Lombok를 추가하겠습니다. 이후에 추가 적으로 필요한 라이브러리는 나중에 추가하도록 하겠습니다.

프로젝트를 다 설정했다면 하단의 GENERATE를 클릭해서 프로젝트 압축 파일을 받고 원하는 곳에 압축을 해제한뒤 이클립스에서 Import해서 사용합니다.

  1. 이클립스 ▶ File ▶ Import ▶ Gradle ▶ Existing Gradle Project 선택
  2. Browse... 버튼으로 위에서 압축 해제한 경로 선택 ▶ Next
  3. Import Options ▶ Override workspace settings 를 체크 ▶ Gradle distribution 에서 Gradle wrapper를  선택 ▶ Finish

 

 

@SpringBootApplication

src 경로에 있는 java 파일을 열어보면 @SpringBootApplication 이 있는데 Spring Boot를 설정하는 클래스임을 알리는 어노테이션입니다.

스프링은 이 어노테이션이 있는 클래스가 있는 패키지를 베이스 패키지로 간주합니다.

스프링은 이 베이스 패키지와 하위 패키지의 자바 빈을 찾아서 의존성 주입을위해 ApplicationContext에 등록하고 의존하는 다른 객체들을 찾아 연결해주는 역할을 합니다.

자동으로 객체를 연결해 주는 것은 @Autowired라는 어노테이션이 담당하고 있습니다.

 

 

@Component

이 어노테이션은 ApplicationContext에 등록할 자바 빈을 명시해주는 어노테이션입니다.

@Component 으로 명시된 객체를 ApplicationContext에 등록하기 위해 @ComponentScan 어노테이션이 컴포넌트로 등록된 클래스들을 스캔해주는 것입니다. 

@SpringBootApplication 어노테이션 내부에 이 @ComponentScan 어노테이션이 포함되어 있기 때문에 컴포넌트 스캔작업이 @Autowired와 함께 자동으로 이루어지므로 신경쓰지 않아도 됩니다.

@Controller, @Service, @Repository 등 어노테이션 내부에 @Component 어노테이션이 포함되어 있습니다.

 

 

@Bean

규모가 큰 프로젝트의 경우 @Autowired를 잘 사용하지 않는데, 개발자가 객체 관계를 정확히 알아야 하는 경우가 많기 때문입니다.

그리고 자동으로 연결되는 빈 객체가 아닌 다른 빈으로 교체해서 사용하는 경우도 있기 때문입니다.

또, 라이브러리 클래스가 스프링 기반이 아니라서 @Component를 사용하지 못하는 경우도 있기 때문입니다. 

그럴 때 스프링으로 빈을 관리하기위해 명시해 주기 위한 어노테이션이 @Bean 입니다. 

이 @Bean을 통해 객체의 생성 방법과 매개변수 등을 스프링에게 알려줄 수 있습니다.

 

 

스프링 부트 어플리케이션 실행

  1. 스프링 부트 어플리케이션이 시작되면 @ComponentScan 이 있는 경우 베이스 패키지와 하위 패키지에서 @Component가 있는 클래스들을 스캔합니다.
  2. 필요한 경우 @Component가 있는 클래스의 객체를 생성합니다. 이때 의존적인 객체가 있다면(즉, 멤버 변수로 다른 클래스가 있다면) 그 객체를 찾아서 주입해줘야합니다. 
  3. @Autowired가 있다면 연결된 변수의 클래스가 @Component로 지정된 클래스인 경우 스프링이 객체를 생성해 넘겨주고, @Bean 으로 되어있는 경우 @Bean이 달린 메서드를 불러서 넘겨줍니다.

위에서 생성한 프로젝트를 실행하려면 CMD를 열고 프로젝트가 있는 경로로 이동합니다.

그리고 명령 표시줄에 gradlew bootRun 을 입력하면 빌드가 진행되고 (JVM running for ...) 메시지가 나오면 실행되고 있는 것입니다.

이상태에서 브라우저를 열고 localhost:8080 을 입력해서 아래와 같이 나오면 정상동작하고 있는 것입니다.

 

 

 

 

 

 

 

 

728x90