src/main/java : 작성되는 코드의 경로
src/main.resources : 실행할 때 참고하는 기본 경로(주로 설정 파일들을 넣는다.)
src/test/java : 테스트 코드를 넣는 경로
src/test/resources : 테스트 관련 설정 파일 보관 경로
servlet-context.xml : 웹과 관련된 스프링 설정 파일
root-context.xml : 스프링 설정 파일
views : 템플릿 프로젝트의 jsp 파일 경로
web.xml : tomcat의 web.ml 파일
pom.xml : Maven이 사용하는 pom.xml
pom.xml : <java-version>11</java-version> 11로 변경
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
ctrl+f 검색 : maven-compiler
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
적용 -> ex00 프로젝트명 오른쪽 마우스 -> Maven -> Update Project 클릭
창이 뜨면 : force update of snapshots/Releases 체크 : OK
lombok 라이브러리 설치
https://projectlombok.org 에서 1.18.2 버전 다운로드
cmd 창 열어서
java -jar lombok-1.18.2.jar
설치 화면에서 sts 경로가 있는지 확인해서 install/update
탐색기 -> sts 실행 경로 안에 lombok.jar
스프링 개발 :
XML 이용,
JAVA 이용
2. 스프링 특징과 의존성 주입
의존성 주입 (Dependency Injection)
- 마틴 파울러
- https://www.martinfowler.com/articles/injection.html#FormsOfDependencyInjection
- 코드의 내부에서 객체간의 연결을 이루지 않고, 외부에서 설정을 통해서 객체간을 연결하는 패턴
- 컴파일시가 아닌 실행시에 의존 관계가 완성되는 방식
- 스프링의 경우 의존성 주입을 쉽게 적용할 수 있는 프레임워크
Heavy / LightWeight Framework
- 2000년대 초반의 분위기
- EJB
- 비싼 WAS
- 많은 것의 통합
- 2000년대 중반 이후
- 빠르고 가벼운 개발 방식
- 작은 서비스의 군집화
- 2010년 이후
- microservice
AOP(Aspect-Oriented Programming)지원
- 시스템 전반에 필요한 기능들을 모듈화 시키고, 비즈니스 로직을 가지는 객체와 결합하는 방식
- crosss-concern: 횡단 관심사로 번역
- 보안이나 로깅과 같이 시스템 여기저기서 필요한 공통적인 기능
- AOP는 횡단 관심사를 분리하고, 이를 결합하는 기능이 필요한데 스프링은 이러한 기능을 프레임워크에서 지원
- Spring AOP는 Proxy객체를 생성
의존성 주입 예제
- 스프링을 이용하는 환경에서 각 각의 객체를 생성하고, 이를 스프링의 설정을 통해서 연결해 보도록 한다.
pom.xml 수정
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
ctrl+f 검색
log4j : 1.2.17
junit : 4.12
예제 클래스 생성
src/main/java -> 패키지 생성 -> org.codegows.sample
패키지 안에 -> Chef.java, Restaurant.java 2개의 클래스 생성
Chef.java 작성
// Chef.java
package org.codehows.smaple;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef {
}
Restaurant.java 작성
// Restaurant.java
package org.codehows.smaple;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component
@Data
public class Restaurant {
@Setter(onMethod_ = @Autowired)
private Chef chef;
}
onMethod_ 에러 발생시
sts 프로그램 종료
탐색기 : c:\user\codepc\.m2 숨김파일보기
.m2 폴더 삭제
lombok 라이브러리 설치
https://projectlombok.org 에서 1.18.2버전 다운로드
cmd 창 열어서
java -jar lombok-1.18.2.jar
설치 화면에서 sts 경로가 있는지 확인 해서 install/update
탐색기 -> sts 실행 경로 안에 lombok.jar 있는지 확인
스프링은 클래스에서 객체를 생성하고 객체들의 의존성에 대한 처리 작업까지 내부에서 모든것이 처리된다.
스프링에서 관리되는 객체는 흔히 '빈(Bean)' 이라고 하고, 이에 대한 설정으니 XML과 JAVA를 이용해서 처리 할 수 있다.
프로젝트의 src폴더 내의 'root-context.xml'은 스프링 프레임워크에서 관리해야 하는 개체를 설정하는 설정 파일이다.
root-context.xml 에 밑에 Namespaces에서 context 체크
<context:component-scan base-package="org.codehows.sample">
</context:component-scan>
코드 입력
반응이 없다면 roo-context.xml 우클릭 -> spring -> Remove as Bean Configuration
스프링이 동작하면서 생기는 일
root-context.xml의 설정 내용이 동작하면서 필요한 인스턴스들(beans)을 생성하고, 의존 관계를 파악해서 주입시켜 주는 방식
테스트 환경의 구성 및 테스트
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Setter(onMethod_ = { @Autowired })
private Restaurant restaurant;
@Test
public void testExist() {
assertNotNull(restaurant);
log.info(restaurant);
log.info("----------------------------------");
log.info(restaurant.getChef());
}
}
SampleTests 클래스는 spring-test 모듈을 이용해서 간단하게 스프링을 가동시키고 의존성에 대한 동작이 일어나게한다.
이때 Junit는 반드시 4.10 이상의 버전을 사용
테스트 코드는 우선 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 것을 @Runwith 어노테이션으로 표시
다음으로 가장 중요한 설정은 @ContextConfiguration 어노테이션과 속성 값인 문자열 설정이다.
@ContextConfiguration은 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록하게 된다.
@ContextConfiguration에 사용하는 문자열을 'classpath:' 나 file:'을 이용할 수 있으므로 sts에서 자동으로 생성된 root-context.xml의 경로를 지정하면 된다.
@Log4j는 Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성
@Autowired는 해당 인스턴스 변수가 스프링으로 부터 자동으로 주입해 달라는 표시이고, 스프링은 정상적으로 주입이 가능하다면 obj 변수에 Restaurant 타입의 객체를 주입하게 된다.
testExist()에 선언되어 있는 @Test는 Junit에서 테스트 대상을 표시하는 어노테이션이다.
asserNotNull()은 restaurant 변수가 null이 아니어야만 테스트가 성공한다는 것을 의미한다.
// SampleTests.java
package org.codehows.sample;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Setter(onMethod_ = @Autowired)
private Restaurant restaurant;
@Test
public void testExist() {
assertNotNull(restaurant);
log.info(restaurant);
log.info("----------------");
log.info(restaurant.getChef());
}
}
Run As -> JUnit Test 실행 -> 정상적으로 실행됨
OracleXE112_Win64.zip 다운알집 풀면 setup.exe 클릭해서 install -> next 계속 해서 다운로드
Oracle SQL Developer 다운
Oracle SQL Developer
새로만들기 > Name , 사용자이름, 비밀번호 입력후 테스트 -> 접속 성공 되면 접속누르기
코드 입력
select dbms_xdb.gethttpport() from dual;
exec dbms_xdb.sethttpport(9090);
/* 사용자 계정 생성 */
CREATE USER book_ex IDENTIFIED BY book_ex
DEFAULT TABLESPACE USERS /* 기본 테이블 스페이스는 USERS로 지정 */
TEMPORARY TABLESPACE TEMP; /* 임시 테이블 스페이스는 TEMP로 지정 */
GRANT CONNECT, DBA TO book_ex; /* 접속 권한과 DBA 관리자 권한 부여 */
/src/test/java
패키지 org.codehows.persistence 생성
JDBCTests.java 생성
// JDBCTest.java
package org.codehows.persistence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import lombok.extern.log4j.Log4j;
@Log4j
public class JDBCTests {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testConnection() {
try(Connection con =
DriverManager.getConnection(
"jdbc:oravle:thin:@localhost:1521:XE",
"book_ex",
"book_ex")) {
log.info(con);
} catch (Exception e) {
fail(e.getMessage());
}
}
}
코드 작성 후 Rus As -> JUnit Test 실행
커넥션 풀 생성
일반적으로 여러명의 사용자를 동시에 처리해야 하는 웹 애플리케이션의 경우 데이터 베이스 연결을 이용할 때는 '커넥션 풀(Connection Pool)을 이용한다.
DataSource를 통해 매번 데이터베이스와 연결하는 방식이 아닌, 미리 연결을 맺어주고 반환하는 구조를 이용하여 성능 향상을 꾀한다. 커넥션풀은 여러 종류가 있고
HikariCP(https://github.com/brettwooldrindge/HikariCP)
라이브러리 추가와 DataSource 설정
pom.xml 에 -> 추가
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.4</version>
</dependency>
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
... (생략) ...
<!-- Root Context: defines shared resources visible to all other web components -->
// 추가
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDirver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"></property>
<property name="username" value="book_ex"></property>
<property name="password" value="book_ex"></property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
... (생략) ...
DataSourceTests 클래스
// DataSourceTests.java
package org.codehows.persistence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
@Setter(onMethod_ = {@Autowired })
private DataSource dataSource;
@Test
public void testConnection() {
try (Connection con = dataSource.getConnection()) {
log.info(con);
} catch (Exception e) {
fail(e.getMessage());
}
}
}
'Spring' 카테고리의 다른 글
스프링 - Part 2 - 스프링 MVC 설정 01 (0) | 2023.03.21 |
---|---|
스프링 - Part 1 - 스프링 개발환경 구축(4.MyBatis와 스프링 연동) (0) | 2023.03.21 |
스프링 웹 프로젝트 MVC - 책 목록 만들기, 책 검색 기능 추가하기 07 (2) | 2023.03.17 |
스프링 웹 프로젝트 MVC - 책 삭제 기능 만들기 06 (0) | 2023.03.17 |
스프링 웹 프로젝트 MVC - 책 수정 화면 만들기, 수정 기능 만들기 05 (0) | 2023.03.16 |