웹서버 기본 개념
서버란 사용자가 요청하는 응답을 반환하기 위해 무한정 대기하는 프로그램이다. 서버는 정적 웹 서버와 동적 웹서버로 구분되는데, 정적 웹서버는 사용자의 요청에 기계적인 응답만 한다. 동적 웹 서버는 사용자가 요청한 매개변수를 요청에 맞는 '작업'을 거친 후에 반환하게 된다. 자바 에서 동적 웹 서버를 구성하는 것이 바로 톰캣 서블릿 엔진이다.
서블릿 컨테이너는 서버 프로그램의 일종이다. 개발자들이 할 일은 서블릿 엔진을 설치하고 비즈니스 로직이 어떤 요청에서 실행되야 하는지 세세하게 구성을 해줘야 한다. 서블릿 엔진이 이해하는 방식은 javax.sevlet.http.HttpServlet을 상속받는 클래스 방식이다.
스프링 Spring 프레임워크
스프링 웹 서버 프레임워크
스프링은 오픈 소스 기반 프레임워크다. 스프링 프레임워크가 개발자들의 힘을 많이 덜어주는 방식은 스프링 AOP(Aspect Oriented Programming), 의존성 주입(DI), 스프링 ORM(Object Relational Mapping), 스프링 웹, 스프링 시큐리티, 스프링 부트 등 다양한 지원 도구들이 존재한다. 스프링의 핵심기능은 의존성 주입(Dependency Injection)이다. 의존성 주입은 IoC와 함께 스프링의 핵심 기능이다.
의존성 주입
의존성 주입(DI, Dependency Injection)이란 클래스가 의존하고 있는 다른 클래스를 외부에서 주입해주는 다는 말이다. 스프링에서 의존성 주입을 Setter와 생성자를 이용해서 해결해준다. 말이 어려운데 그냥 매개변수로 필요한 클래스들을 넘겨 받도록 해준다는 것이다. new 키워드를 사용해서 의존성을 주입하거나 setter 메소드로 의존성을 주입하게 된다. 스프링 프레임워크는 어노테이션이나 XML, 자바 코드를 가지고 오브젝트(빈 bean)간의 의존성을 명시한다. 애플리케이션 시작 시점에서 IoC 컨테이너(ApplicationContext 등)가 오브젝트들을 관리해주는 것이다.
디스패쳐 서블릿(DispatcherSevlet)
스프링 부트에서는 어노테이션과 서브 클래스를 이용해서 반복작업을 제거한다. 특히 디스패쳐 서블릿이라는 서블릿 서브 클래스가 이미 구현되어 있어서 어노테이션과 인터페이스만을 이용해서 비즈니스 로직을 돌릴 수 있다.
스프링 부트 시작하기
스프링 프로젝트는 스프링 부트에서 제공하는 환경구성 툴을 사용한다. Spring Initializer에서는 project, Language, Spring Boot Version, Project Metadata, Dependencies를 설정해서 빠르게 프로젝트를 실행할 수 있다. Dependencies에는 <Spring Web><Spring Data JPA><H2 Database><Lombok>정도 추가해서 프로젝트를 생성한다.
프로젝트는 Maven과 Gradle 두가지 빌드도구 옵션을 제공한다. 지금은 Gradle 기반 프로젝트로 진행한다.
프로젝트를 생성하면 프로젝트.zip을 해제해준다. 프로젝트.zip을 압축 해제하면 총 7개의 디렉토리 및 파일이 들어있다.
IntelliJ IDE에서 압축해제된 디렉토리를 선택해서 프로젝트 OPEN하면 아래 기본 디렉토리가 생성된 것을 볼 수 있다. 최초로 프로젝트를 생성하면 Gradle에서 자동으로 필요한 도구들을 다운로드 하면서 프로젝트 빌드 구성을 완성해준다.
프로젝트의 시작점은 src > main > java > com.example.demo > DemoApplication.java에서 시작한다. @SpringBootApplication 어노테이션은 해당 클래스는 스프링 부트가 설정한 클래스임을 표시한다. 또한 이 어노테이션이 붙어있으면 스프링 부트는 해당 패키지를 베이스 패키지로 간주하게 된다. 스프링은 선택된 베이스 패키지와 하위 패키지를 자바 빈에서 찾아서 의존성 주입 컨테이너 오브젝트(ApplicationContext)에 등록한다. 그리고 애플리케이션 중 필요한 오브젝트가 있을 경우 찾아서 자동으로 연결을 진행해준다. 이게 의존성 주입 컨테이너의 기능이다.
자동으로 다른 오브젝트를 찾아 연결해주는 어노테이션은 @Autowired다. 스프링이 애플리케이션 컨텍스트에 등록할 자바빈을 @Component 어노테이션을 통해서 찾는다. @Component가 달린 클래스는 해당 클래스를 자바 빈으로 등록하라고 명령하는 어노테이션이다. 추가적으로 @ComponentScan 어노테이션이 어떤 클래스에 있어야 컴토넌트를 스캔할 수 있는데, @SpringBootApplication이 이미 @ComponentScan을 포함하고 있기 때문에 우리가 굳이 수동으로 작업을 하지 않아도 되는 것이다.
이제 스프링을 이용해서 자동으로 빈에 추가해 관리하고 싶은 클래스는 상단에 @Component를 추가해주고 @Autowired를 붙이면 스프링이 알아서 필요할 때 필요한 의존성을 주입해주게 되다. 만약 수동으로 의존성 주입을 하고자 할 때는 @Bean 어노테이션을 사용하게 된다. "이 빈은 이렇게 생성해라"라고 명령하는 것이다. @Bean 매개변수에 어떻게 생성하고 어떻게 넣어줘야 하는지 알려줄 수 있다.
정리
1. 스프링 부투 애플리케이션은 https://start.spring.io/에서 프로젝트를 생성하면서 시작한다.
2. @ComponentScan 어노테이션이 붙어 있는 경우에는 스프링이 베이스 패키지와 하위 패키지에서 @Component가 달린 클래스를 찾게 된다.
3. @Autowired를 붙이면 필요한 오브젝트를 찾아서 의존성을 자동으로 주입해준다.
4. @Bean을 붙이면 @Bean이 달린 메소드를 불러서 생성해서 매개변수로 넘겨준다.
애플리케이션 실행 / 빌드 자동화
스프링 애플리케이션을 실행하는 방법은 베이스 클래스를 우클릭해서 실행하는 방법과 터미널에서 실행 명령어를 입력해서 실행하는 방법이 있다.
./gradlew bootRun
이제 웹 브라우저를 실행해서 localhost:8080/으로 접속하면 정상적으로 스프링부트에 붙어 있는 톰캣 서버 프로그램이 작동하는 것을 확인할 수 있다. localhost는 127.0.0.1과 동일한 IP 주소로 내 컴퓨터의 IP 주소를 의미한다.
빌드 자동화 도구
프로젝트를 생성할 때 Gradle 프로젝트로 생성했다. Gradle은 빌드 자동화 툴이다. 컴파일, 라이브러리 다운로드, 패키징, 테스팅 등의 작업을 모두 '자동화'할 수 있다. 빌드 자동화는 사용하는 이유는 불필요한 반복작업을 제거하기 위함이다. 만약 Gradle 빌드 자동화 툴이 없으면 스프링 웹 애플리케이션을 만들면서 필요한 jar 라이브러리 파일들을 찾아서 꽤 많은 시간을 써야 한다.
또한 빌드 자동화 툴은 여러가지 빌드를 나눠서 진행하게 해준다. 개발자가 직접 컴파일, 빌드, 유닛 테스트를 실행하지 않고 이 과정을 코드로 구현해놓으면 빌드 자동화 툴이 코드를 해석해서 프로젝트 빌드에 필요한 작업을 실행해주는 것이다. 그루비 언어 기반으로 만들어진 Gradle 빌드 자동화 툴은 build.gradle에서 확인할 수 있다. 여기서 버전을 확인하고 필요한 플러그인들이 추가된 것을 볼 수 있다. 또한 프로젝트 생성과정에서 추가한 dependencies가 자동을로 구현되어 있는 것을 확인할 수 있다.
롬복 Lombok
롬복은 어노테이션을 추가해서 컴파일 시 필요한 코드를 만들어준다. 롬복이 코드를 작성하기 위해서는 어노테이션 프로세서가 필요하다. configurations에서 annotationProcessor를 사용하라고 Gradle에 알려주고 있는 것이다. org.projectlombok:lombok을 어노테이션 프로세서로 사용하라고 Gradle에 알려주고 있는 코드가 필요한 것이다.
롬복 라이브러리를 사용하면 롬복이 제공하는 Annotation Processor가 getter, setter, builder, constructor 프로젝트 컴파일시 관련 코드를 자동으로 만들어준다.
Repositories
Gradle이 필요한 라이브러리를 다운로드 하는 장소가 필요하다. 이곳을 Repository라고 하는데, 해당 프로젝트에서는 mavenCentral을 사용한다. 만약 추가로 필요할 라이브러리를 찾고자 한다면 maven repository 사이트에서 찾아서 Gradle에 추가해주면 된다.
당신을 위한 콘텐츠
'Programming' 카테고리의 다른 글
자바 JAVA 제네릭 Generic이란? (0) | 2022.03.31 |
---|---|
스프링 부트 SpringBoot 웹 애플리케이션 개발 #2 백엔드 개발 (0) | 2022.03.29 |
줌 프로그래밍 만드는 방법 클론 코딩 (0) | 2022.03.29 |
자바 배열 선언 2차 배열 0으로 초기화 하는 방법 java.lang.NullPointerException (0) | 2022.03.22 |
Kotlin kotlin-android-extentions가 제거된 안드로이드 4.1 XML 객체 선택하는 방법 (0) | 2022.03.09 |
Ubuntu NPM node.js install 설치하기 (0) | 2022.03.08 |
댓글