1. Project Structure & Build Tool
빌드관리도구 선택 : 라이브러리를 관리해주고 빌드 및 실행을 도와주는 주체
- Gradle : 최신 gradle, 빌드속도가 빠름,
- Maven : legacy
2. Java Version
- Specify the Java version in your build tool config:
- JDK : 코드 작성시에는 Java 버전 번호만 중요하고 특정 Vendor는 빌드할때에만 결과물에 영향을 미친다.
- Usually follow team convention
3. 스프링부트
Spring Boot는 Spring Framework의 모든 기능을 포함하면서도, 개발자가 빠르게 개발을 시작할 수 있도록 추가적인 지원과 도구를 제공합니다. spring initializer(https://start.spring.io/)를 사용한자동 설정을 통해 Spring boot project의 구조를 알아서 만들어준다. Spring 애플리케이션 구성을 간소화합니다. 반면, Spring Framework는 수동으로 빈을 구성하고 의존성을 주입해야 합니다.
스프링부트를 통한 프로젝트 생성
- spring initializer : 스프링 기반으로 프로젝트를 만들어주는 스프링 부트 사이트 (https://start.spring.io/)
- Project Metadata
- Group : 기업명 혹은 도메인 입력으로 artifact가 동일한 build 결과물 간의 이름을 구분하기 위해서 사용됨
- (com.naver.map) general한 것에서 좁은 범위로 나아가서 좁혀두는 것
- artifact : build 결과물 파일의 이름. Intelij의 프로젝트 이름은 폴더이름임.
- Group : 기업명 혹은 도메인 입력으로 artifact가 동일한 build 결과물 간의 이름을 구분하기 위해서 사용됨
- Packaging : Java 애플리케이션을 배포하는 방법에 있어 패키징방식
- JAR : java archive ; 스탠드얼론 Java 애플리케이션을 단일 실행 가능 파일로 패키징하기 위해 사용됩니다. 이는 내장 HTTP 서버(예: Tomcat, Jetty, Undertow 등)를 포함하여 애플리케이션을 실행하는 데 필요한 모든 것을 포함합니다.
- WAR : web application archive. war는 일반적으로 내장 HTTP 서버를 포함하지 않습니다. 대신, WAR 파일은 Servlet 컨테이너나 Java EE 애플리케이션 서버(예: Apache Tomcat, Jetty)에 배포되어 실행됩니다. 기업 환경에서 여러 애플리케이션을 중앙 서버에 배포하여 관리할 때 사용됩니다.
- Dependency
- 어떤 라이브러리를 불러와서 쓸 것인지 선택 ;Spring Web, Thymeleaf
- Project Metadata
스프링부트 패키지구조
디렉토리 트리구조
- .gradle : gradle 구동시점에 필요한 숨김파일
- .idea : intellij 구동시점에 필요한 숨김파일
- 숨김파일 프로젝트의 임시파일이나 구동시점에서만 필요한 파일들. 개발자가 들어가서 작업할 필요x
- gradle : build.gradle이 동작한 빌드 결과값
src : 개발자가 작업할 공간
- main
- java : 실제 소스파일
- JavaSpringApplication : @SpringbootApplication과 springapplication을 실행시 톰켓이라는 웹서버를 실행함.
- Controller package : 웹 어플리케이션에서 첫진입점이됨.
- resources : html을 포함한 자바 외의 모든 파일
- static directory에 'index.html'을 생성해주면 정적인 홈페이지를 만들어준다.
- 동적인 홈페이지를 만들고 싶으면 thymeleaf를 사용해야함.
- java : 실제 소스파일
- test : test와 main이 분리되어 있으며 이는 최근 test 코드를 중요시하는 트렌드를 반영함.
- gitignore : 깃에 올리기 위해서 불필요한 파일들을 제외하는 파일. (.idea나 .gradle처럼 구동시점에만 필요한 코드들 / 개인의 환경설정에 관여하는 코드들)
- build.gradle : 스프링 부트에서 설정된 셋팅들과 버전설정 및 라이브러리 호출하는 파일로, 프로젝트 첫 빌드시 실행시킴.
프로젝트 환경 설정
application.yml 또는 application.properties 파일은 Spring Boot 애플리케이션의 설정 정보로서 Spring 동작의 Parameter역할을 하고 있다고 생각하면 된다. 파일을 통해 애플리케이션의 동작 방식을 설정할 수 있다. 여기에는 데이터베이스 연결 정보, JPA 설정, 서버 포트, 로깅 설정 등 다양한 애플리케이션 관련 설정이 포함될 수 있습니다.
환경 프로파일 설정
환경은 일반적으로 로컬환경, 개발테스트환경, 실제운영환경 보통 3가지 환경이 존재하며, 각 환경마다 바라보는 DB와 같은 설정이 다르다. 코드 상에서는 환경과 무관하게 작동하도록 작성하고, 환경별로 분리되는 내용은 환경설정인 (yml/properties) 값에 담는다.
Spring Boot는 **spring.profiles.active**라는 설정 값을 사용해 활성화할 프로파일(Profile)을 지정합니다. 설정값에 따라서 application-{profile}.yml 또는 application-{profile}.properties 파일을 선택적으로 읽어들인다.
프로파일 활성화방식
Spring Boot는 Profile을 활성화할 때, 각 설정 위치(JVM 프로퍼티, 환경 변수, 설정 파일, 코드 등)를 순차적으로 확인하고 우선순위에 따라 값을 적용합니다. 저장 위치가 다르기 때문에 Spring Boot는 각 데이터 소스를 확인하며 가장 높은 우선순위 값을 활성화합니다.
JVM 프로퍼티로 설정
- 실행 시 JVM 프로퍼티를 사용해 프로파일을 활성화.
java -Dspring.profiles.active=dev -jar myapp.jar
환경 변수로 설정
- 운영 체제의 환경 변수로 spring.profiles.active 값을 설정.
export SPRING_PROFILES_ACTIVE=prod
설정 파일에서 지정
- application.yml에서 기본 프로파일을 지정.
spring:
profiles:
active: dev
코드에서 설정
- SpringApplication을 통해 프로파일 활성화.
SpringApplication app = new SpringApplication(MyApplication.class);
app.setAdditionalProfiles("dev");
app.run(args);
데이터베이스 datasource 연결 정보
데이터베이스와 연결하기 위한 설정을 정의합니다. 이는 데이터베이스 URL, 사용자 이름, 비밀번호, 드라이버 클래스 등을 포함합니다.
spring:
datasource:
url: jdbc:h2:mem:test
username: sa
password:
driverClassName: org.h2.Driver
h2:
console:
enabled: true
jpa:
defer-datasource-initialization: true
database-platform: H2
hibernate:
ddl-auto: create-drop
open-in-view: false
properties:
hibernate:
format_sql: true
show_sql: true
spring.datasource Section
- url : JDBC connection URL로 JDBC (Java Database Connectivity) API에게 DB연결과 관련된 Parameter을 제공한다고 볼수 있다. 어떤 데이터베이스와 어떻게 연결할지에 대한 설정을 진행한다.
- JDBC URL은 일반적으로 다음과 같은 형태를 따른다. jdbc:[database-type]:[connection-details]
- 여기서 jdbc:h2:mem:test : mem은 in-memory구조를 지칭하며, test는 테스트 목적임을 지칭한다. 이와 같이 jdbc url을 통해서 연결할 데이터베이스의 타입을 정할수 있다.
- url다음에 ; 기호 뒤에 custom을 위한 특수한 파라미터가 올 수 있다.
- DB_CLOSE_DELAY=-1: parameter specific to H2. It tells the database to remain open after the last connection is closed
- INIT=RUNSCRIPT FROM 'classpath:sql/h2gis-init.sql' : INIT is an instruction to H2 that tells it to initialize , RUNSCRIPT FROM 'classpath:sql/h2gis-init.sql': This part specifies the location of the SQL script (h2gis-init.sql) in the classpath
- username : DB의 사용자이름
- password : DB의 Pw
- driver-class-name : 어떤 jdbc driver을 사용할지 선택해줌 (org.h2.Driver). If you specify the url (like jdbc:h2:mem:testdb), Spring Boot will automatically infer the correct JDBC driver from the URL. So, in many cases, you don’t need to explicitly specify the driver-class-name because Spring Boot can infer it from the URL.
spring.h2 section
- h2
- console :enabled : h2-console이라는 url을 통해서 h2 db 조작을 가능하게하는 콘솔창을 활성화할지 결정한다.
spring.jpa Section
- JPA / Hibernate Settings : how entities are managed and how schema generation is handled.
- defer-datasource-initialization : 테이블에 초기데이터/테이블 스키마를 메뉴얼로 설정해주고 싶을때 사용. 테이블이 생성될때까지 Sql 스크립트의 실행을 지연시키고 hibernate가 table을 생성한 후 작동하도록 조절함.
- resource아래에 두 파일이 위치해야만 springboot에서 파일을 인식하고 동작시킨다.
- schema.sql: For schema-related SQL commands (e.g., table creation, indexes).
- data.sql: For inserting initial data.
- data-base-platform : Tells Hibernate to use the which DB dialect for generating SQL statements.
- hibernate
- ddl-auto: data delete automation 테이블 및 스키마의 생성과 삭제를 자동으로 관리하는 기능
- create : :어플리케이션 가동 시점에 테이블 생성
- create-drop :어플리케이션 가동 시점에 테이블 생성, 종료시점에 테이블 삭제
- validate : Hibernate는 애플리케이션에서 정의한 엔티티와 데이터베이스의 테이블이 일치하는지 검증합니다. 테이블과 스키마가 일치하지 않으면 오류를 발생시킵니다.
- update : Hibernate가 데이터베이스 스키마와 애플리케이션 엔티티 간의 차이를 감지하고, 필요한 경우 스키마를 수정합니다. 그러나 기존 데이터를 삭제하지 않고 테이블이나 컬럼을 추가하거나 수정하는 방식으로 작동합니다.
- defer-datasource-initialization: true ensures that any SQL scripts (like schema.sql) run after Hibernate has created the tables.
- ddl-auto: data delete automation 테이블 및 스키마의 생성과 삭제를 자동으로 관리하는 기능
- properties
- hibernate:
- dialect : Tells Hibernate to use the which DB dialect for generating SQL statements.
- format_sql : hibernate에서 실행하는 sql statement를 보기좋은 포맷으로 만듬
- show_sql : hibernate에서 실행하는 sql statement를 출력하여 보여줌
- hibernate:
- defer-datasource-initialization : 테이블에 초기데이터/테이블 스키마를 메뉴얼로 설정해주고 싶을때 사용. 테이블이 생성될때까지 Sql 스크립트의 실행을 지연시키고 hibernate가 table을 생성한 후 작동하도록 조절함.
- H2 연결설정 : h2: console : enabled : true
서버 포트 설정
애플리케이션이 실행되는 포트를 설정할 수 있습니다. 기본적으로 Spring Boot 애플리케이션은 포트 8080에서 실행됩니다.
Server Configuration : Basic server configurations such as port, context path, and session settings.
server:
port: 8080
servlet:
context-path: /api
tomcat:
max-threads: 200
- Security Settings: Configurations related to security, such as authentication methods, password encoding, and security headers.
spring:
security:
user:
name: admin
password: admin123
oauth2:
client:
registration:
google:
clientId: id
clientSecret: secret
- Logging Configuration : Define logging levels, log file paths, and configure different logging frameworks.
로깅 설정
애플리케이션의 로깅 수준과 형식을 설정할 수 있습니다. Spring Boot는 기본적으로 다양한 로깅 프레임워크를 지원합니다.
logging:
level:
org.springframework: DEBUG
com.myapp: INFO
file:
path: /var/log/myapp.log
- Profile-Specific Configuration : Manage settings for different environments using profiles, such as development, testing, and production.
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://production-host/mydb
username: produser
password: prodpass
- Messaging and Email Settings : Configuration for messaging systems like RabbitMQ, Kafka, or email services.
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
mail:
host: smtp.example.com
username: user
password: pass
properties:
mail:
smtp:
auth: true
starttls: enable
- External Service Configuration : Integrate with external services or APIs, including configuring API keys, endpoints, and other connection details.
app:
weather-api:
url: http://api.weatherapi.com/v1/current.json
key: your-api-key
- Application-Specific Custom Properties : Define custom application-level properties that are specific to the business logic or operational parameters.
app:
pagination:
default-size: 20
feature:
enable-new-feature: true
기타설정
1. 애플리케이션 설정
2. 환경별 설정
Spring Boot는 프로파일을 통해 환경별로 다른 설정을 적용할 수 있습니다. 예를 들어, 개발 환경에서는 application-dev.yml, 프로덕션 환경에서는 application-prod.yml 파일을 사용할 수 있습니다. 이를 통해 개발, 테스트, 운영 환경에서 다른 설정을 쉽게 적용할 수 있습니다.
고유Key설정
API Key값과 같이 환경마다 분리하여 관리하여야 하는 값이 있다면 property 파일에 해당 값을 설정하고, 변수위에 @value("${key이름.key}")로 맵핑 한다면 환경변수의 값에서 값을 injection 해준다. 참고적으로 "${key이름.key}"는 SpEL로 환경변수를 가져오는 것
'개발기술 > Spring' 카테고리의 다른 글
Spring 동시성이슈 해결 (0) | 2024.07.30 |
---|---|
스프링 전체구조 (0) | 2024.07.24 |
스프링 MVC, 예외처리 (0) | 2024.07.18 |
스프링 부가기능 (Resource, AOP, 유효성검증, 데이터바인딩,spel) (0) | 2024.07.17 |
스프링 도입의 배경 ; Java로 스프링 구현해보기 (0) | 2024.05.17 |