지난번 포스팅에서 프로젝트 생성 및 서버 구동까지 진행을 했었다. 이번 포스팅에서는 DB 연결, Logging을 위한 설정을 하고 웹 화면에 "Hello World"를 출력하는 것까지 진행해 보려고 한다. 먼저 학습용으로 사용할 DB를 준비한다. Local이 되었든 개발기가 되었든 postgreSQL을 설치하고 Sample Database를 설치한 후 이후 과정을 진행하길 바란다.
https://clien78.tistory.com/231
나의 경우엔 아래의 정보를 기준으로 DB를 설치하고 접속한다.
DB / Version | PostgreSQL 14.12 on x86_64-pc-linux-gnu |
IP | 192.168.0.106 |
Port | 5432 |
ID | postgres |
Password | postgres |
Databases | dvdrental |
Schemas | public |
1. Source Code 작성에 필요한 Library를 설치하기 위한 Dependency 설정
Maven Project 구성파일인 'pom.xml' 파일을 통해 Project의 종속성(dependencies), 빌드 설정(build configuration), 플러그인(plugins) 등을 정의 한다. Maven은 Java Project 관리 도구로, Project Build, Report 생성, 배포 등을 자동화 하는데 사용된다. 'pom.xml'은 Project Object Model의 약자로, XML 형태로 작성된다.
최초 Project 생성 시 선택한 옵션에 따라서 필요한 Library를 가져오기 위한 Dependecy 설정이 이미 'pom.xml'에 추가 되어 있을 것이다. 추가로 Apache Log4j 2 와 servlet-api를 사용하기 위하여 Dependecy를 추가하자. Maven Repository를 통해서 최신 Version의 Library 설정을 하는 것을 추천한다.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<scope>provided</scope>
</dependency
'pom.xml' 파일에 위의 dependency를 추가하자. log4j2 는 logging을 하기 위함이고 servlet-api는 http 요청 정보를 얻기 위한 Library이다. Coding을 하면서 어느 부분에서 필요한지는 자연스럽게 이해가 될 것이다.
2. Database 연동을 위해 application.properties 값 설정
'application.properties' 파일은 Spring Boot Application의 설정을 정의 하는 파일이다. Database와의 연결을 위해 Database Connection 정보를 설정한다.
PostgreSQL Database Setting
- 'Spring.application.name=DVDRental' : Application Name을 설정한다. 이 이름은 Application의 식별자 역할을 하게 된다. 여러 서비스가 함께 작동하는 마이크로서비스 아키텍처에서 유용하게 사용된다.
- 'Server.port=8080' : Application 수신 대기를 할 http port를 지정한다. 기본값이 8080 이다. 사용자가 원하는 port로 변경 가능하다.
- 'spring.datasource.url=jdbc:postgresql://192.168.0.106:5432/dvdrental?currentSchema=public' : PostgreSQL Database에 연결하기 위한 JDBC URL 이다. Database 서버의 IP주소(192.168.0.106), PostgreSQL 기본 Port(5432), 연결할 Database Name(dvdrental), 사용할 Schema Name(public)을 설정했다.
- spring.datasource.username=postgres : Database에 연결하기 위한 사용자 이름이다.
- spring.datasource.password=postgres : Database에 연결하기 위한 사용자 비밀번호 이다.
- spring.datasource.driver-class-name=org.postgresql.Driver : PostgreSQL JDBC Driver Class Name을 지정했다. Spring Boot는 이 정보를 사용하여 JDBC Driver를 자동으로 Load 한다.
Hibernate JPA Setting
- spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect : Hibernate(ORM, Object-Relational Mapping Framework이다. 이를 통해 개발자는 객체 지향적인 방식으로 관계형 Database를 다룰 수 있다. Hibernate는 객체 지향 프로그래밍 언어와 관계형 Database 사이의 불일치를 해결하는 도구이다.)가 PostgreSQL Databse와 상호작용할 때 사용할 Dialect를 지정한다. 이는 SQL Query를 PostgreSQL에 맞체 최적화 한다.
- spring.jpa.hibernate.ddl-auto=update : Hibernate가 Application 시작 시 Database Schema를 자동으로 Update하는 방식을 지정한다. 설정값 'update'는 기존 Table을 유지하면서 필요한 변경사항을 적용한다. 다른 옵션으로는 'none', 'validate', 'create', 'create-drop' 이 있다.
- spring.jpa.generate-ddl=false : Hibernate가 자동으로 DDL(Data Definition Language) 명령을 생성할지 여부를 설정한다. 'false' 설정은 Hibernate가 DDL을 생성하지 않게 한다.
- spring.jpa.show-sql=true : Hibernate가 실행되는 SQL Query를 Log로 출력하도록 설정한다. Debugging을 위해 'true'로 설정한다.
Logback Setting
- logging.level.root=info : Root Logger의 Log Level을 'info'로 설정 했다. 'info' Level 이상('warn', 'error' 등)의 Log가 출력된다.
- logging.level.kr.co.iamwhatiam=debug : 'kr.co.iamwhatiam' Package에 대한 Log Level을 'debug'로 설정했다. 이 Package의 Log Message는 debug level 이상 ('debug', 'info', 'warn', 'error')으로 출력이 된다.
- logging.level.kr.co.iamwhatiam.dvdrental=TRACE : 'kr.co.iamwhatiam.dvdrental' Package에 대한 Log Level을 'Trace'로 설정했다. 이 Package의 모든 Log Message가 출력된다. 'Trace'는 가장 낮은 Log Level로 상세한 Debugging을 위해서 유용하게 사용된다.
위의 설정 이외에 추후에는 장비별로 properties file을 구분하고 JSP Viewer 설정 등 SpringBoot 의 각종 설정을 추가할 예정이다. 이번 포스팅에서 사용하게될 내용을 먼저 추가하여 설정하였다.
3. Directory 구조
이 Project의 Directory 구조는 API 와 WEB으로 구분할 것이다. API는 순수하게 RESTFul API 기능을 구현하기 위한 곳이고 WEB은 Web Browser를 통해 접속되는 영역을 담당하게 될 곳으로 구분하려고 한다. 각 Directory는 예하로 Service 별 Directory를 생성하고 그 예하로 controller, service, mapper Directory로 구분하여 각 기능별 source file을 분리 저장하도록 할 것이다. 그리고 common Directory는 공통으로 사용될 코드들을 저장하도록 할 예정이다. 그러면 먼저 'Hello World' 를 Web Browser를 통해서 출력하기 위한 기본 Directory 구조를 구성하도록 하자.
이번 포스팅에서 할 'Hello World' 출력은 Web Service 첫 화면에서 출력하게 할 예정이므로 Index Directory에 코딩을 하기로 한다. src/main/java/kr/co/iamwhatiam/dvdrental/Web/Index/Controller 에 IndexViewController.java Class 를 생성하자.
생성한 IndexViewController에 아래와 같이 Code를 작성한다.
package kr.co.iamwhatiam.dvdrental.Web.Index.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Controller
public class IndexViewController {
private static final Logger logger = LoggerFactory.getLogger(IndexViewController.class);
@RequestMapping(value="/")
@ResponseBody
public String getIndexView(HttpServletRequest request, Model model) {
logger.info("[IndexViewController.getIndexView] Start >> Model >> " + model.toString());
return "Hello World";
}
}
이제 지난 포스팅에서 처럼 Run As - Spring Boot App 을 선택해서 서비스를 구동해 보자.
Web Brower를 통해서 http://localhost:8080/ 에 접속해 보면 Code에서 Return 한 "Hello World"가 출력되는 것을 볼 수 있다.
아직 처음 단계이므로 Code에 대한 상세 설명을 진행하겠다.
package kr.co.iamwhatiam.dvdrental.Web.Index.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Class 선언부이다. Package 선언을 하고 필요한 Library를 import 한다.
- 'org.springframework.stereotype.Controller' : 이 class가 Spring MVC Controller 임을 나타냄
- 'org.springframework.ui.Model' : view에서 전달받은 데이터를 사용하는데 사용
- 'org.springframework.web.bind.annotation.RequestMapping' : 요청된 URL을 메서드와 매핑하는데 사용
- 'org.springframework.web.bind.annotation.ResponseBody' : 메서드의 반환값을 HTTP 응답 본문으로 직접 전달 하는데 사용
- 'jakarta.servlet.http.HttpServletRequest' : HTTP request 정보를 나타내는 class
- 'org.slf4j.Logger 및 org.slf4j.LoggerFactory' : logging 기능을 제공
@Controller
public class IndexViewController {
private static final Logger logger = LoggerFactory.getLogger(IndexViewController.class);
Class 본문
- @Controller : 이 Class가 Spring MVC Controller 임을 나타내기 위한 애노테이션, HTTP Request를 처라하는 Method를 정의할 수 있다.
- Logger Instance 생성 : 'LoggerFactory.getLogger(IndexViewController.class)' class Logger Instace를 생성한다. 이를 통해서 Log Message를 기록할 수 있게 된다.
@RequestMapping(value="/")
@ResponseBody
public String getIndexView(HttpServletRequest request, Model model) {
logger.info("[IndexViewController.getIndexView] Start >> Model >> " + model.toString());
return "Hello World";
}
}
Method 정의
- @RequestMapping(value="/") Annotation : 이 Method가 Root URL("/")에 대한 HTTP Request을 처리하도록 Mapping 한다.
- @ResponseBody Annotation : 이 Annotation은 Method의 Return값이 View Name이 아니라 HTTP Response 본문으로 직접 전송 되도록 한다. 따라서, 이 Method는 단순하게 "Hello World"라는 문자열을 HTTP Response Body로 Return 하게 된다.
이 Class는 Spring Boot Application의 Root URL ("/")에 대한 HTTP Request를 처리하는 Controller 이다. Root URL에 대한 Request가 발생하면 "getIndexView" Method가 호출되고, "Hello World"라는 문자열이 Response Body로 Return 된다. 더불어 Logging을 통해서 Method 실행 시점에 Model 객체의 상태를 Log로 기록한다.
앞으로 작성하게 될 대부분의 코드 형태가 오늘 포스팅된 Directory 구조에서 비롯되고 Controller의 기본 구조 역시도 위의 설명에서 크게 벗어나지 않는다. 이번 포스팅에서는 application.properties 의 기본설정 및 Controller에서 HTTP Request에 대한 처리 방식에 대한 간단한 예젤르 통해서 Code 실행의 흐름을 파악했다. 다음 포스팅에서는 DB에 저장된 값을 "Hello World" 문장열 대신에 출력해 볼 예정이다.
최대한 따라서 쫓아오기 쉽게 설명하려고 노력하고 있다. 한단계 한단계 빠뜨리지 않고 쫓아왔다면 내가 실행한 화면과 동일한 결과를 얻을 수 있을 것이다. 이 글을 읽으는 당신이 만약 개발을 공부하기 위한 상황이라면 GitHub 같은 곳에 Upload 되어 있는 Code를 Download 받아서 쫓아 오는 방식 보다는 한글자 한글자 타이핑 하면서 실제로 코드를 작성해보는 것을 적극 권장한다. 그래야 내 Code가 되고, 그래야 기억에 남고, 그래야 실무에서 사용할 수 있게 된다. 남이 작성한 Code를 눈으로만 이해하려고 한다면 절대로 맨바닥에서 서 Code를 작성할 수 있는 실력으로 성장할 수 없을 것이다.
'Blog > JAVA' 카테고리의 다른 글
MyBatis XML의 Parameter 기호인 $ 와 # 은 어떤 차이가 있나 ? (0) | 2024.07.18 |
---|---|
RESTFul-API SampleCoding (Java,SpringBoot,Maven,myBatis) #4 (0) | 2024.07.17 |
RESTFul-API SampleCoding (Java,SpringBoot,Maven,myBatis) #3 (0) | 2024.07.16 |
RESTFul-API SampleCoding (Java,SpringBoot,Maven,myBatis) #1 (0) | 2024.07.15 |
Rocky Linux 8 설치 후 Java 관련 설치 및 환경변수 설정 (0) | 2024.07.03 |