application.properties는 Spring Boot에서 애플리케이션의 설정을 정의하는 프로퍼티 파일입니다. 이 파일을 통해 데이터베이스 연결 정보, 서버 포트, 로그 레벨 등 다양한 설정을 관리할 수 있습니다.
기본적으로 Spring Initializr 를 통해 Spring Boot 프로젝트를 생성하면 application.properties가 생성됨.
1. 파일의 역할
- 애플리케이션에 필요한 설정 값과 환경 변수를 정의합니다.
- 코드를 변경하지 않고 설정 값을 쉽게 수정할 수 있습니다.
- 환경별로 다른 설정을 적용할 수 있습니다 (e.g., application-dev.properties, application-prod.properties).
2. 파일 위치
application.properties 파일은 보통 src/main/resources 폴더에 위치합니다.
경로:
src/main/resources/application.properties
3. 주요 설정 항목
3.1 서버 설정
server.port=8080 # 서버의 포트 설정
server.servlet.context-path=/api # 애플리케이션의 컨텍스트 경로 설정
여기서 중요한건, key=value 의 형태로 이루어질 때, = 을 기준으로 공백이 있으면 그것도 인식을 해버리기 때문에 공백 없이 해야 함. key = value, key=value 랑 다르게 인식한다는 것.
3.2 데이터베이스 설정 (properties 와 yml 에서의 DB Setting)
Spring Boot는 데이터베이스와의 연결 설정을 간단하게 할 수 있습니다.
예시 (MySQL 연결):
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
java 에서는 DB 의 여러가지 공급자(벤더)들이 있어서, 자기네 DB에 맞게 접속 같은 걸 할 수 있도록 각 벤더들이 드라이브 클래스를 제공한다. 그래서 벤더들이 제공해주는 드라이버가 있어야 한다. 드라이버는 java 에서 제공하는게 아니라 벤더들이 제공하는거라서 벤더 홈페이지를 가거나 인터넷에서 찾아보면 찾을 수가 있다.
그리고 DB는 아무나 접근하는게 아니기 때문에 접근 권한이라는게 있어서 유저 이름과 패스워드가 있어야 한다.
그리고 DB의 url 을 알아야 어떤 DB에 접근하는지 알 수 있다. 접속 url 도 벤더마다 다 다르다.
접속 url 도 java 에서 제공하는게 아니라 벤더가 정한 것. 그래서 각 벤더들의 접속 url의 프로토콜을 찾아서 작성 방법을 찾아서 쓰면 된다.
jdbc 를 이용해서 java와 DB를 연결시켜주는, jdbc를 통해서 DB에 연결하는 것.
spring boot는 기본적으로 hikaricp 라는 커넥션 pool 을 이용해서 DB의 성능을 개선시켜서 쓰고 있다.
jdbc 를 이용해서 DB에 커넥션을 하고, 그 커넥션 여러개를 미리 메모리에 만들어놔서 그 커넥션을 재활용을 해가지고 DB의 성능을 개선시키는 방법이 커넥션 pool 이다. spring boot 는 내부적으로 hikaricp 라는 API 를 이용해서 커넥션 pool 을 내부적으로 만든다.
어쨌든, MySQL이든 Oracle, MS SQL, 어떤 DB를 쓰든, jdbc 세팅을 해야 한다. jdbc 세팅을 하려면 위의 4가지를 세팅해야 한다.
properties 파일에서는,
spring.datasource 라는 게 반복적으로 4가지 세팅에 모두 다 들어가고 있다.
spring.datasource.~~~=~~~
spring.datasource.~~~=~~~
spring.datasource.~~~=~~~
spring.datasource.~~~=~~~
이렇게 되고 있다.
그런데, yml 파일에서 DB Setting 을 한다고 하면,
spring:
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:orcl
username: username
password: password
저렇게 spring datasource 는 한 번 만 쓰면 된다는 점.
(들여쓰기는 space bar 로 2칸씩)
yml -> properties,
properties -> yml
이렇게 파일을 컨버팅 해주는 서비스도 있음. (https://mageddo.com/tools/yaml-converter)
3.3 JPA 설정 (ORM 사용 시)
Spring Data JPA를 사용할 때 추가로 설정합니다.
spring.jpa.hibernate.ddl-auto=update # 스키마 자동 업데이트
spring.jpa.show-sql=true # SQL 쿼리 출력
spring.jpa.properties.hibernate.format_sql=true # SQL 포맷팅
3.4 로깅 설정
Spring Boot 애플리케이션의 로그 레벨을 설정합니다.
logging.level.org.springframework=INFO
logging.level.com.myapp=DEBUG
logging.file.name=app.log # 로그를 파일로 출력
4. application.properties vs application.yml
Spring Boot는 .properties 대신 YAML 형식의 application.yml 파일도 지원합니다.
application.properties:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
application.yml:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
YAML은 계층 구조를 쉽게 표현할 수 있어 가독성이 좋습니다.
yml을 사용하는 것이 더 구조를 파악하기 쉽고, 중복되는 코드가 줄어든다는 장점이 있음.
계층(들여쓰기)의 경우에는, space bar 2칸 으로 생각하면 된다.
5. 정리
- application.properties는 Spring Boot 애플리케이션의 환경 설정 파일입니다.
- 서버, 데이터베이스, 로깅 등 다양한 설정을 관리합니다.
- 프로파일 기능을 사용하면 환경별 설정을 적용할 수 있습니다.
- 필요에 따라 application.yml로 대체할 수도 있습니다.
Spring Boot 프로젝트를 개발할 때 설정 값들을 파일에 저장하면 유연하게 변경할 수 있으므로 필수적으로 사용됩니다.
실습을 해보려고 한다.
# Project 02 - 데이터베이스 연결
아래 properties 파일을 일단 공부해보자.
# 톰켓 서버 포트 변경
server.port=8081
# 데이터베이스 구성
spring.datasource.url=jdbc:h2:file:./db/bookdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=admin
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# H2 데이터베이스 접속 (콘솔 설정)
spring.h2.console.enabled=true
spring.h2.console.path=/db-console
# 데이터베이스 초기화
spring.jpa.hibernate.ddl-auto=create
# 생성된 SQL 문장 보는 로깅 활성
spring.jpa.show-sql=true
# 생성된 SQL 문장을 읽기 쉽게 형식화
spring.jpa.properties.hibernate.format_sql=true
- 포트 변경 8081 로 했다.
- DB setting 을 하려면 4가지를 입력해야 한다고 했다. 여기서는 h2 DB를 사용할 것이다.
- ./db/bookdb 라고 하면, .(점) 은 현재 디렉토리를 의미하고 거기서 db 라는 디렉토리에 bookdb.mv.db 라고 하는 것. 저 파일이 없다고 하면, db 라는 디렉토리도 없다고 하면, db 라는 디렉토리 만들고 나서 bookdb.mv.db 라는 파일을 만들게 된다.
- 이 DB 를 쓰느냐, Spring Data JPA 에서 이 DB의 커넥션을 쓸 것. Spring Data JPA 는 기본적으로 Hibernate 라는 엔진이 탑재가 되어 있다. 이 Hibernate 엔진이 SQL 쿼리를 자동으로 generation 을 해주는데, 이 hibernate가 현재 DB가 어떤 DB 언어인지를 알아야 한다. 언어라고 하면, Dialect, 방언이라고 하기도 하는 단어가 있다. 각 DB 언어에 맞는 언어라는 단어가 영어로 하면 Dialect 라고 하는데, hibernate가 어떤 SQL 언어로 DB SQL generation 을 해야 하는데 어떤 언어인지 알아야 한다. 그래서 spring.jpa.database-platform= 에다가 H2 DB 언어를 쓰겠다고 지정을 해줘야 H2 DB 에 맞게 SQL 쿼리를 생성해준다.
- 만들어진 DB에 접속을 해봐야 한다. 그러면 Spring Boot 하고 만들어진 H2 DB 하고 연결이 되면, 세션, 세션이라는게 하나 만들어진다. 이 세션이 만들어지면, 콘솔로 만들어진 DB에 접속을 해볼 수가 있다.
- 접속을 하려면 그 콘솔을 enabled 해야 한다.
- 콘솔로 접속을 하려면, 접속 path url 이 필요한데, 그건 우리가 만들어주면 된다. /db-console 이라고 했으면,
- http://localhost:8081/db-console 이라고 해주면 h2 db 에 접속할 수 있는 콘솔이 뜬다.
- url, driver, username, password를 입력해주면 만들어놓은 db에 콘솔로 접속할 수가 있다.
- 데이터베이스 초기화, DB가 만들어지고 나면 그 DB 안에 table 이 하나 만들어져야 뭔가 작업을 할 수가 있다.
- table 을 만들기 위해서, jpa 의 hibernate 한테, ddl-auto (database definition language 데이터베이스 정의 언어로 create 같은 것들이 있다. table 을 생성해주는 언어들을 자동auto 으로 해주라는 것), 그래서 =create 라고 하게 되면은 database table을 h2 db 안에 create 하게 되는 것.
- table 은 JPA에서 entity이다. Entity -> orm -> table / Entity가 orm 기술을 이용해서 실제로 table로 생성이 되는 것. 그래서 create 라는 건, Entity 클래스를 이용해서 table 을 generation 해라 라는 뜻이다.
- table 을 generation 하려면, 기본적으로 create table bookEntity(SQL 쿼리가 막 있을 것) 이렇게 SQL 쿼리가 생성될 것인데, 그 생성된 SQL 문장을 볼 수 있도록 로깅을 활성해주는 걸 spring.jpa.show-sql=true
- 그 SQL 쿼리를 보기 쉽게 들여쓰기, 내어쓰기 등의 형식화를 하려면, spring.jpa.properties.hibernate.format_sql=true 라고 해주면, 보기가 좀 쉽다.
- main run 콘솔창에 SQL이 찍히니까 어떤 SQL이 자동으로 생성되는지 확인해볼 수가 있다.
아까 위에서 언급한 컨버팅 사이트에서 yml 로 convert 를 해준 것이 아래에 있다.
spring:
datasource:
username: admin
url: jdbc:h2:file:./db/bookdb
driverClassName: org.h2.Driver
password: password
h2:
console:
enabled: 'true'
path: /db-console
jpa:
database-platform: org.hibernate.dialect.H2Dialect
properties:
hibernate:
format_sql: 'true'
hibernate:
ddl-auto: create
show-sql: 'true'
server:
port: '8081'
이렇게 파일 구성을 하면, 데이터베이스 연결은 되는 것이다.
data jpa api 를 탑재하게 되면, spring boot 가 'DB 를 이용하려고 jpa 라이브러리를 설정했구나' 라고 판단한다.
그러면 DB에 연결을 시도하려고 할 것이다.
그래서 application.properties 파일에 DB 구성에 대한 부분을 체크를 할 것이다.
그걸 보고 내부적으로 DB 연결을 한다는 것.
DB가 있으면 그걸 연결하는 connection 이 있다. 그런 connection 을 모아놓은 걸 connection pool 이라고 한다. 그런 메모리 공간이 있다. jdbc 에서는 connection 이라고 하지만, Mybatis 에서는 (sql) session 이라고 부른다.
중요한 건, 데이터베이스 구성 정보를 보고 커넥션 풀을 내부적으로 만들어 준다는 것이다. 커넥션 풀은 미리 시스템을 실행할 때 미리 커넥션을 만들어놓고 메모리를 가지고 있는 것이다. DB 를 연결하는 그 시점이 시스템에 부하, 로드가 걸릴 수 있는 가능성이 있다. 특히 유저의 수가 많아진다고 하면 DB 에 부하가 걸릴 수가 있다. 그래서 미리 커넥션을 서버가 만들어놓고, 커넥션이 필요하면 가지고 와서 사용하고 나서 다시 커넥션 풀에 반납을 해서 재사용성을 높여서 DB의 성능을 개선하는 기법을 커넥션 풀이라고 한다. 커넥션 풀은 말그대로 여러개의 커넥션을 미리 만들어서 가지고 있는 메모리라고 한다. 그걸 누가 하느냐, API 가 하는데, hikariCP 라는 라이브러리, API가 커넥션 풀을 만들고 관리한다. 이 커넥션 풀을 누가 사용하느냐, JPA 가 사용한다. JPA 내부에 있는 하이버네이트 엔진 중 엔티티매니저가 커넥션을 필요로 하면 꺼내서 DB로 CRUD 를 할것이고, 그 커넥션을 다 사용하면 반납을 할 것이다.
정리된 설명: Connection Pool과 HikariCP
- Connection과 Connection Pool
- Connection: DB와 연결되는 하나의 연결 객체입니다.
- Connection Pool: 여러 개의 Connection을 미리 생성해서 메모리에 저장해두고, 필요할 때 가져다 사용하는 기법입니다.
- Connection Pool의 역할
- 문제: 유저 수가 많아질수록 DB 연결(Connection)을 생성하는 과정이 시스템에 부하를 줍니다.
- 해결: Connection Pool은 시스템이 시작될 때 미리 여러 Connection을 만들어두고 필요할 때 사용합니다.
- 사용 후 반납하여 재사용성을 높입니다.
- 성능을 개선합니다.
- JDBC와 MyBatis의 용어 차이
- JDBC: Connection이라는 용어를 사용합니다.
- MyBatis: (SQL) Session이라는 용어를 사용합니다.
- Connection Pool을 누가 만들고 관리하는가?
- HikariCP: Connection Pool을 만들어 관리하는 라이브러리입니다.
- Connection Pool을 누가 사용하는가?
- JPA (Java Persistence API):
- 내부에 있는 Hibernate 엔진의 EntityManager가 필요할 때 Connection을 꺼내서 사용합니다.
- CRUD 작업이 끝나면 Connection을 반납합니다.
- JPA (Java Persistence API):
구조 시각화 (plaintext)
[ 시스템 실행 시 ]
└── HikariCP (API/LIBRARY)
├── Connection Pool 생성 및 관리
│ ├── Connection 1
│ ├── Connection 2
│ ├── Connection 3
│ └── ... 여러 개의 Connection 미리 준비
│
└── Connection 요청
│
├── JPA
│ ├── Hibernate 엔진
│ │ ├── EntityManager (Connection 필요)
│ │ │ ├── Connection 꺼냄 (DB로 CRUD 실행)
│ │ │ └── Connection 반납 (재사용)
│
└── MyBatis
├── SQL Session (Connection 역할)
└── CRUD 작업 후 Connection 반납
핵심 요약
- Connection Pool: 미리 Connection을 만들어 메모리에 저장하여 성능을 개선하는 기법입니다.
- HikariCP: Connection Pool을 생성하고 관리하는 라이브러리입니다.
- JPA: Hibernate 엔진의 EntityManager가 HikariCP의 Connection Pool을 사용합니다.
- 재사용: Connection을 사용 후 반납하여 재사용성을 높입니다.
- Connection Pool 개념
- 미리 여러 DB 커넥션을 만들어 메모리에 저장하고 필요할 때 꺼내 쓰고 반납하는 기법 → 성능 개선에 핵심적입니다.
- JDBC와 MyBatis의 차이
- JDBC: Connection을 사용.
- MyBatis: SQL Session이 Connection과 같은 역할을 합니다.
- HikariCP
- 커넥션 풀을 생성하고 관리하는 라이브러리/API입니다.
- JPA와 Hibernate
- JPA는 Hibernate 같은 ORM 구현체를 통해 DB 작업을 수행합니다.
- Hibernate 엔진의 EntityManager가 HikariCP의 Connection Pool에서 Connection을 꺼내서 CRUD 작업 후 반납합니다.
- 시스템 부하 해결
- 커넥션을 미리 생성해서 시스템 실행 시 준비하기 때문에 유저 수가 많아지더라도 DB 부하를 줄여줍니다.
* yml 을 쓰고 싶으면 확장자, 파일 형식을 바꿔야 한다. 만약 properties 와 yml 을 같이 사용한다면, 우선 순위가 properties 라서 yml 은 인식이 안 된다.
# Project 02 - Entity 만들기 (Model 만들기)
DB에 책이라는 정보를 저장하려면 book table 이 필요하다.
이 table 을 직접적으로 만드는게 아니라, java에서 Entity 클래스를 이용한다.
@Entity 라는 어노테이션을 적으면, public class Book 이 book table 로 바뀐다는 것.
ORM (object relational mapping) 이라는 기술이 table 로 바꿔준다는 것.
hibernate가 @Entity가 붙어있는 model 을 보고 그대로 orm 을 통해서 DB에 table 이 generation 하게 해준다.
이 때, create 라는 sql 명령문이 내부적으로 generation 된다. 그 generation 된 내용을 보기 위해서 세팅을 해놨었다.
이제, Entity 클래스를 만들어보자.
package 를 먼저 만들건데, model 이라고 해도 되고, entity 라고 해도 되고, domain 이라고도 한다.
여기서는 entity 라고 하자. 책이라는 걸 만들 것이다.
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
이렇게 개별적으로 import 한 것을, import.lombok.* 이라고 해서 깔끔하게 할 수도 있다.
Entity 까지 다 만들었으니 실행을 한 번 해보자. 실행을 하면, Table 이 만들어져야 한다는 것.
메인 어플리케이션을 실행(run)하면
spring boot 어플리케이션이 쭈욱 실행되면서
메모리에 관련된 라이브러리들이 쭈욱 올라가고
오토컨피규레이션 다 되고
그리고 spring data jpa 에 의해서 table 이 생성이 되는 부분이 나올 것.
이해가 잘 되고 있다.
저기서 특이한 건, created_at 이라고 하는건데,
클래스 코드에서는 createdAt 이라고 했다.
A 가 대문자로, 카멜 케이스 표기법 (낙타 등 처럼)
그런데 database generation 에서 보면, _ underscore 로 갔다.
클래스 엔티티로 만들때에는 카멜 케이스 표기법 <----> DB table 로 볼 때는 스네이크 케이스 표기법 으로 한다.
스네이크 케이스 표기법은 뱀이 길게 쭈욱 있다고 해서, 길게 쓰는 표기법.
그래서 createdAt 이 자동으로 created_at 이 된다.
spring boot 가 내부적으로 표기법이 약속되어 있기 때문이다. 만약 Entity 에 있는 이름 그대로 DB에 쓰겠다고 하면 설정을 바꿔주면 된다. 일단은 기본적으로 약속은 각 표기법이 정해져 있다.
암튼, table 이 정말 만들어졌는지 확인 해보자.
db console 로 가서 확인을 해보자.
'Spring Boot (+ RESTful)' 카테고리의 다른 글
Spring Boot - Maven/Gradle을 사용한 종속성 관리 (1) | 2024.12.16 |
---|---|
Spring Boot - 실습 - #Project 02 (Repository, Service, Controller, View 만들자) (0) | 2024.12.16 |
Spring Boot - 자동 구성 메커니즘 Auto Configuration / 실습 - #Project 01 (1) | 2024.12.15 |
Spring Boot - Starter / MVN Repository / (0) | 2024.12.15 |
Spring Boot - '프로젝트 구조 이해' / 데이터 흐름에 대한 이해 / Thymeleaf에 대한 이해 / view 처리 (0) | 2024.12.14 |