Java 코드에서 Bean 생성
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("hr");
dataSource.setPassword("1234");
이렇게 jsp내에서 직접 datasource를 설정하게되면 한 파일안에서 명확하게 드러나지만 코드가 길어지고 복잡해졌을때 가독성이 떨어지고 객체 간의 dependency를 관리하기 어렵다.
마치 요리 식재료들을 펼쳐놓고 요리를 하는 것과 같다. 요리를 할때 빠르게 재료들을 가져올 수는 있으나 가지수가 많아질수록 관리하기도 힘들고 요리할 때 시간이 정해져 있을 경우 실수하기 쉽다.
따라서 아래에서 spring과 spring boot를 통해서 datasource를 외부화 시키는 것을 알아보자.
Spring Framework(스프링 프레임워크)
스프링을 사용하게 되면 설정을 외부화 하여 코드와 분리함으로써 관리가 용이하고 스프링 컨테이너가 애플리케이션 시작 시 자동으로 Bean을 생성하게된다. 또한 환경에 따라 다른 설정을 쉽게 적용할 수 있다. 단, 설정 파일이 잘못되면 오류가 발생하기 쉬우니 주의해야한다.
1. application.properties를 통한 datasource설정
스프링 부트에서는 application.properties 파일을 통해 설정을 외부에서 관리할 수 있다. 데이터베이스 연결 정보, 서버 포트, 로깅 설정 등과 같은 애플리케이션의 실행 시 필요한 설정을 포함한다.
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=spring
spring.datasource.password=1234
장점: 설정을 외부화하여 코드와 분리함으로써 관리가 용이하며 환경에 따라 다른 설정을 쉽게 적용할 수 있다.
# gradle build refresh 시 자동으로 context-path 가 Board 로 변경되어지므로 수정해야함
# 호출시 http://localhost:9090/Board -> http://localhost:9090/
# Web page Setting : Board -> /
server.servlet.context-path=/
# server 의 port 번호(oracle 11g 8080 사용)
server.port = 9090
# jsp 가 저장될 폴더이름 "src/main/webapp/WEB-INF/views/" + "home" + ".jsp"
spring.mvc.view.prefix = /WEB-INF/views/
spring.mvc.view.suffix = .jsp
# jsp파일을 필수적으로 사용
# JSP 수정시 서버 재시작없이 바로 적용할 수 있게 설정
server.servlet.jsp.init-parameters.development = true
단점: 설정 파일이 잘못되면 런타임 오류가 발생할 수 있다.
이는 주방의 메뉴판을 외부에 두고, 요리사가 메뉴를 보고 요리를 만드는 것과 같다. 이렇게 하면 설정이 더 명확하고, 필요할 때마다 쉽게 변경할 수 있다.
2. XML 설정을 통한 Bean 정의
XML 파일을 통해 Bean을 정의하는 것은 냉장고나 식재료 보관실을 따로 두고 있는 것과 같다.
<bean id="dataSource"
class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="hr" />
<property name="password" value="1234" />
</bean>
장점: 설정을 XML 파일에 정의하여, 스프링 컨테이너가 애플리케이션 시작 시 자동으로 Bean을 생성한다.
단점: XML 설정이 복잡해질 수 있으며, 코드의 가독성이 떨어질 수 있다.
냉장고가 있으면 주방의 식재료들을 더 효율적으로 관리할 수 있다.
3. dependecy 설정
프로젝트의 의존성, 플러그인, 빌드 작업 등을 정의한다. 예를 들어, Spring Boot 관련 의존성을 설정할 수 있다.
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.2.10'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.board'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// 수동 추가 - 수정후 gradle -> refresh gradle project 실행: 안하면 동작안함(중요)
// jdk 11 까지
//implementation 'javax.servlet:jstl' // springboot 2.x
//implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
// jdk 17, jsp , jstl
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' // 스프링부트 3.0 이상
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상
// junit
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.board</groupId>
<artifactId>PrjMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>PrjMaven</name>
<description>Board project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
특징 | Maven POM 파일 | Gradle 스크립트 |
파일 형식 | XML 형식 | Groovy 또는 Kotlin DSL 형식 |
플러그인 관리 | <build> 섹션 내 <plugin>태그로 정의 | plugins { ... } 블록 내에서 정의 |
그룹 및 아티팩트 정보 | <groupId>, <artifactId>, <version>으로 정의 | group, version으로 정의 |
Java 버전 설정 | <properties>섹션에서 <java.version>으로 설정 | java { toolchain { languageVersion = ... }}로 설정 |
의존성 정의 | <dependencies> 섹션 내 <dependency> 태그로 정의 | dependencies { ... } 블록 내에서 정의 |
의존성 스코프 | <scope> 속성으로 정의 | implementation, compileOnly, runtimeOnly 등으로 정의 |
프로젝트 빌드 설정 | <build> 섹션 내에서 <plugins>로 정의 | tasks { ... } 블록 내에서 정의 |
테스트 설정 | <dependencies> 내에 test 스코프 사용 | testImplementation으로 정의 |
WAR 패키징 설정 | <packaging>war</packaging>로 정의 | apply plugin: 'war'로 설정 |
JSP 및 JSTL 의존성 | 의존성의 <dependency> 태그로 정의 | implementation으로 추가 |
👉build.gradle과 xml파일은 빌드 및 의존성 관리를 위한 설정하는 동일한 역할이다
4. @Autowired로 의존성 주입
스프링에서는 @Autowired annotation을 사용하여 자동으로 의존성을 주입할 수 있다. 예를 들어, 위의 datasource를 자동으로 주입하는 코드는 다음과 같이 작성할 수 있다.
애너테이션(Annotation)은 Java에서 메타데이터를 제공하는 특수한 형태의 태그이다. 애너테이션은 클래스, 메서드, 변수 등에 추가하여 그 요소에 대한 정보를 제공하거나 특정 기능을 수행하도록 하는 데 사용된다. 스프링 프레임워크와 같은 많은 Java 프레임워크에서 주로 사용된다.
@Autowired
private DataSource dataSource;
📍의존성 주입: @Autowired는 스프링 컨테이너에서 관리하는 Bean을 자동으로 주입한다. 따라서 java 클래스는 dataSource를 직접 생성할 필요 없이 사용할 수 있다.
스프링 빈객체가 있기 때문에 Autowired를 통해 미리 application.properties 의 설정에 따라 new 된 bean 객체를 자동으로 연결한다.
이는 요리사가 주방에 들어가 필요한 기구를 쉽게 사용할 수 있도록 하는 것과 같다. 요리사는 주방을 직접 만들 필요 없이, 필요한 기구를 바로 사용할 수 있다.
'SPRING' 카테고리의 다른 글
[spring]스프링 부트 MVC구조 (3) | 2024.10.08 |
---|---|
[spring] 스프링 부트 Controller (0) | 2024.10.08 |
[spring]Payload,Parameter, Attribute들의 관계 (2) | 2024.10.01 |
[spring]JSTL(JSP Standard Tag Library) (2) | 2024.10.01 |
[spring] EL (Expression Language) (0) | 2024.09.29 |