본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch07 스프링 MVC 프로젝트 기본 구성

728x90
반응형

1. MVC 프로젝트 기본 구성 및 초기 설정

   ▷ 스프링 MVC를 이용하는 프로젝트의 구성을 이해하는 일은 전체 데이터 흐름을 보기 위해서임.

   ▷ 브라우저에서 전송한 데이터를 스프링 MVC의 어떤 단계를 거쳐서 실행되는지 알면 문제 발생시 빠른 대처, 대안을 찾을 수 있음

 

일반적인 웹 프로젝트 구성 3-tier(티어) 방식으로 구성


1. Presentation Tier(화면 계층)는 화면에 보여주는 기술을 사용하는 영역
   ▷ 프로젝트의 성격에 맞춰 앱으로 제작하거나 CS(Client-Server)로 구성되는 경우도 있음
   ▷ 스프링 MVC와 JSP를 이용한 화면 구성이 이에 속함

2. Business Tier(비즈니스 계층)는 순수한 비즈니스 로직을 담고 있는 영역
   ▷ 고객이 원하는 요구 사항을 반영하는 계층이기 때문(영역의 설계는 고객의 요구 사항과 정확히 일치해야 함)
   ▷ 'xxxService'와 같은 이름으로 구성하고 메소드의 이름 역시 고객들이 사용하는 용어를 사용하는 것이 좋음

3. Persistence Tier(영속 계층 혹은 데이터 계층)은 데이터를 어떤 방식으로 보관하고 사용하는가에 대한 설계가 들어가는 계층
   ▷ 데이터 베이스를 많이 사용하지만 경우에 따라 네트워크 호출이나 원격 호출 기술이 접목됨


스프링 MVC 영역은 Presentation Tier를 구성하게 되고, 각 영역은 별도의 설정을 가지는 단위로 볼 수 있음

 

 

2. 예제 프로젝트 구성

   ▷ Spring Legacy Project를 생성해 'ex02' 이름 지정 → org.codehows.controller 생성

 

(1) pom.xml 수정

...(생략)...
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
...(생략)...


   ▷ 자바 버전, 프레임워크 버전 변경


◎ 스프링 관련 라이브러리 추가(spring-tx, spring-jdbc, spring-test)

...(생략)...
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>${org.springframework-version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>${org.springframework-version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>${org.springframework-version}</version>
	</dependency>	
...(생략)...


◎ MyBatis 라이브러리 추가(HikariCP, MyBatis, mybatis-spring, Log4jdbc)

...(생략)...
	<!-- MyBatis -->
	<dependency>
		<groupId>com.zaxxer</groupId>
		<artifactId>HikariCP</artifactId>
		<version>2.7.8</version>
	</dependency>
		
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.6</version>
	</dependency>
		
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>1.3.2</version>
	</dependency>
    
	<dependency>
		<groupId>org.bgee.log4jdbc-log4j2</groupId>
		<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
		<version>1.16</version>
	</dependency>
...(생략)...


◎ 테스트, Lombok을 위해 jUnit 버전 변경 및 Lombok 추가

...(생략)...
	<!-- Test -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version> <!-- 4.7 → 4.12로 내용 수정 -->
		<scope>test</scope>
	</dependency>
		
	<!-- 추가 -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.0</version>
		<scope>provided</scope>
	</dependency>
</dependencies>


◎ 서브릿 버전 수정

...(생략)...
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>3.1.0</version>
		<scope>provided</scope>
	</dependency>
...(생략)...


◎ Servlet 3.1 버전, JDK8 기능 활용 위한 Maven 관련 Java 버전 수정

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
            <source>11</source> <!-- 내용 수정 -->
            <target>11</target> <!-- 내용 수정 -->
            <compilerArgument>-Xlint:all</compilerArgument>
            <showWarnings>true</showWarnings>
            <showDeprecation>true</showDeprecation>
        </configuration>
    </plugin>


ex02 우클릭 → Maven → Update Project

 

 

(2) 테이블 및 dummy 생성

   ▷ SQL Developer 접속 및 이전에 생성샜던 book_ex 계정을 통해 테이블 생성

create sequence seq_board;

create table tbl_board(
    bno number(10,0),
    title VARCHAR2(200) not null,
    content VARCHAR2(2000) not null,
    writer VARCHAR2(50) not null,
    regdate date default sysdate,
    updatedate date default sysdate
);

alter table tbl_board add constraint pk_board
primary key(bno);


게시물은 각 게시물마다 고유의 번호가 필요한데 오라클의 경우 시퀀스를 통해 작업 처리를 합니다.
시퀀스 생성시 다른 오브젝트들과 구분하기 위해 'seq_'와 같이 시작합니다.

 

◎ 테이블에 행 추가

insert into tbl_board(bno, title, content, writer)
values (seq_board.nextval, '테스트 제목', '테스트 내용', 'user00');

select * from tbl_board;


insert를 여러번 실행하면 동일한 값이 순서만 바뀌면서 삽입됩니다.

select * from tbl_board 실행하면 아래와 같이 나타납니다.

오라클은 MySQL과 다르기 때문에 isert가 끝나면 반드시 커밋(F11)을 해야합니다.

 

3. 데이터베이스 관련 설정 및 테스트

   ▷ root-context.xml에는 mybatis-spring 네임스페이스를 추가하고, Part 1에서 작성한 DataSource 설정과 MyBatis 설정 추가


◎ root-context.xml 내용 추가

...(생략)...
	<bean id="hikariConfig"	class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
		<property name="username" value="system"></property>
		<property name="password" value="password"></property>
	</bean>
	
	<!-- HikariCP configuration -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
	destroy-method="close">
	<constructor-arg ref="hikariConfig" />
	</bean>
	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<mybatis-spring:scan base-package="org.codehows.mapper"/>
</beans>

 

◎ src/main/resources → log4jdbc.log4j2.properties 생성

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

◎ src/test/java → org.codehows.persistence 패키지 생성

1. DataSourceTests.java 클래스 생성
package org.codehows.persistence;

import static org.junit.Assert.fail;

import java.sql.Connection;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
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;
	
	@Setter(onMethod_ = { @Autowired })
	private SqlSessionFactory sqlSessionFactory;
	
	@Test
	public void testMyBatis() {
		try(SqlSession session = sqlSessionFactory.openSession();
				Connection con = session.getConnection();
				){
			log.info(session);
			log.info(con);
		} catch(Exception e) {
			fail(e.getMessage());
		}
	}
	
	@Test
	public void testConnection() {
		try (Connection con = dataSource.getConnection()){
			log.info(con);
		} catch(Exception e) {
			fail(e.getMessage());
		}
	}
}​


◎ JDBCTests.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:oracle:thin:@localhost:1521:XE",
					"book_ex",
					"book_ex")){
		log.info(con);
	} catch(Exception e) {
		fail(e.getMessage());
	}
}
}

 

 

MVC 프로젝트 기본 구성 방법에 대해서 시행해보았습니다.

 

이때까지 배웠던 것들을 바탕으로 설정들을 모두 추가해보았습니다.

 

pom.xml과 DB 연결을 해보았으니 오라클의 구문들을 이용해 보도록 할게요!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형