ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3-ch7 스프링 MVC] 프로젝트 기본 구성, DB 더미 테이블 생성
    Back-End/Spring Legacy 2022. 8. 17. 11:24

     

     

    스프링 MVC 프로젝트의 기본 구성

     

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

     

     

     

     

    Persentation tier(화면계층)은 화면에 보여주는 기술을 사용하는 영역이다. 앞의 포스팅 내용을 살펴봤을 땐 Servlet/JSP나 스프링 MVC가 담당하는 영역이 된다. Persentation tier는 프로젝트의 성격에 맞춰 앱으로 제작하거나, CS(Client-Server)로 구성되는 경우도 있다. 

     

    Business Tier(비지니스 계층)는 순수한 비즈니스 로직을 담고있는 영역이다. 이 영역이 중요한 이유는 고객이 원하는 요구 사항을 반영하는 계층이기 때문이다. 이 영역의 설계는 고객의 요구 사항과 정학히 일치해야 한다. 이 영영은 주로 'xxxService'와 같은 이름으로 구성하고, 메서드 이름 역시 고객들이 사용하는 용어를 그대로 사용하는 것이 좋다.

     

    Persistence Tier(영속 계측 혹은 데이터 계층)는 데이터를 어떤 방식으로 보관하고, 사용하는가에 대한 설계까 들어가는 계층이다. 일반적인 경우에는 데이터베이스를 많이 이용하지만, 경우에 따라서 네트워크 호출이나 원격 호출 등의 기술이 접목될 수 있다. 

     

     

     

    controller -> service -> DAO

     

     

    스프링 MVC 영역은 Presentation Tier를 구성하게 되는데, 각 영역은 사실 별도의 설정을 가지는 단위로 볼 수 있다. 예를 들어 root-context.xml / servlet-context.xml 등의 설정 파일이 해당 영역에 속하게 된다. 스프링 Core 영역은 흔히 POJO의 영역이다. 스프링의 의존성 주입을 이용해서 객체 간 연관구조를 완성해서 사용한다. MyBatis 영역은 현실적으로는 mybatis-spring을 이용해 구성하는 영역이다. 

     

     

    이렇게 3-tier로 구성하는 가장 일반적인 설명은 '유지 보수'에 대한 필요성 때문이다. 각 영역은 독립적으로 설계되어 나중에 특정한 기술이 변하더라도 필요한 부분을 전자제품의 부품처럼 쉽게 교환할 수 있게 하자는 방식. 따라서 각 영역은 설계 당시부터 영역을 구분하고, 해당 연결 부위는 인터페이스를 이용해 설계하는 것이 일반적인 구성 방식이다. 

     

     

     

    프로젝트 진행 시 영역의 네이밍 규칙

     

    - xxxController : 스프링 MVC에서 동작하는 Controller 클래스를 설계할 때 사용한다.

     

    - xxxService, xxxServiceImpl : 비즈니스 영역을 담당하는 인터페이스는 'xxxService'라는 방식을 사용하고, 인터페이스를 구현한 클래스는 'xxxServiceImpl'이라는 이름을 사용한다. 

     

    - xxxDAO, xxxRepository : DAO(Data-Access-Object)나 Repository(저장소)라는 이름으로 영역을 따로 구성하는 것이 보편적이다. 다만 포스팅할 예제에서는 별도의 dao를 구성하는 대신 MyBatis의 Mapper 인터페이스를 활용한다.

     

    -  VO, DTO : VO와 DTO는 일반적으로 유사한 의미로 사용되는 용어로, 데이터를 담고 있는 객체를 의미한다. 

     

     

     

     

    패키지의 Namming Conversion

     

    패키지의 구성은 프로젝트의 크기나 구성원들의 성향으로 결정한다. 예를 들어, 규모가 작은 프로젝트는 Controller의 영역을 별도의 패키지로 설계하고, Service영역 등을 하나의 패키지로 설계할 수 있다.

     

    반면에, 프로젝트의 규모가 커서 많은 서비스와 컨트롤러들이 혼재할 수 있다면 비즈니스 단위별로 구분하고 다시 내부에서 Controller 패키지, Service 패키지로 나누는 방식을 이용한다. 

     

     

     

     

     

    프로젝트 생성

     

    MVC와 MyBatis를 이용해 기본적인 CRUD(등록, 수정, 삭제, 조회)와 페이징 처리, 검색 기능의 게시물 관리를 만들어 보기 위해서 wex02라는 프로젝트를 생성한다. 생성 후 pom.xml 수정 사항은 아래와 같다.

     

    - 스프링 버전 변경

    - spring-test, spring-jdbc, spring-tx 추가

    - junit버전 변경

    - Servlet 버전 변경

    - HikariCP, MyBatis, mybatis-spring, log4j2 추가

    - jdbc 드라이버 프로젝트 내 추가

    - 기타 lombok ,,, 

     

     

    <?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/maven-v4_0_0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>org.zerock</groupId>
    	<artifactId>controller</artifactId>
    	<name>wex02</name>
    	<packaging>war</packaging>
    	<version>1.0.0-BUILD-SNAPSHOT</version>
    	<properties>
    		<java-version>1.6</java-version>
    		<org.springframework-version>5.3.21</org.springframework-version>
    		<org.aspectj-version>1.6.10</org.aspectj-version>
    		<org.slf4j-version>1.6.6</org.slf4j-version>
    	</properties>
    	<dependencies>
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>${org.springframework-version}</version>
    			<exclusions>
    				<!-- Exclude Commons Logging in favor of SLF4j -->
    				<exclusion>
    					<groupId>commons-logging</groupId>
    					<artifactId>commons-logging</artifactId>
    				 </exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${org.springframework-version}</version>
    		</dependency>
    		<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>
    		
    		<!-- 오라클 -->
    		<dependency>
    			<groupId>com.oracle.database.jdbc</groupId>
    			<artifactId>ojdbc6</artifactId>
    			<version>11.2.0.4</version>
    		</dependency>
    				
    		<!-- AspectJ -->
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjrt</artifactId>
    			<version>${org.aspectj-version}</version>
    		</dependency>	
    		
    		<!-- log4j2 변경 -->
    		<dependency> 
    			 <groupId>org.apache.logging.log4j</groupId> 
    			 <artifactId>log4j-api</artifactId> 
    			 <version>2.18.0</version> 
    		 </dependency> 
    		 <dependency> 
    			 <groupId>org.apache.logging.log4j</groupId> 
    			 <artifactId>log4j-core</artifactId> 
    			 <version>2.18.0</version> 
    		 </dependency> 
    		 
    		 <dependency> 
    			 <groupId>org.apache.logging.log4j</groupId> 
    			 <artifactId>log4j-slf4j-impl</artifactId> 
    			 <version>2.18.0</version> 
    		 </dependency> 
     		 <dependency>
    		 	<groupId>org.bgee.log4jdbc-log4j2</groupId>
    		 	<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
    		 	<version>1.16</version>
    		 </dependency>
    		
    
    
    		<!-- @Inject -->
    		<dependency>
    			<groupId>javax.inject</groupId>
    			<artifactId>javax.inject</artifactId>
    			<version>1</version>
    		</dependency>
    				
    		<!-- Servlet -->
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>javax.servlet-api</artifactId>
    			<version>4.0.1</version>
    			<scope>provided</scope> 
    			<!-- 
    			<version>3.1.0</version>
    			<scope>provided</scope> -->
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet.jsp</groupId>
    			<artifactId>jsp-api</artifactId>
    			<version>2.1</version>
    			<scope>provided</scope>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>jstl</artifactId>
    			<version>1.2</version>
    		</dependency>
    		
    		<!-- Lombok -->
    		<dependency> 
    			 <groupId>org.projectlombok</groupId> 
    			 <artifactId>lombok</artifactId> 
    			 <version>1.18.24</version> 
    			 <scope>provided</scope> 
    		 </dependency>
    		 
     		<!-- HikariCP 추가 -->
    		<dependency>
    		   <groupId>com.zaxxer</groupId>
    		   <artifactId>HikariCP</artifactId>
    		   <version>2.7.4</version>
    		</dependency>
    		
    		
    		<!-- mybatis 추가 -->
    		<dependency>
    			<groupId>org.mybatis</groupId>
    			<artifactId>mybatis</artifactId>
    			<version>3.4.6</version>
    		</dependency>
    		
    		<dependency>
    			<groupId>org.mybatis</groupId>
    			<artifactId>mybatis-spring</artifactId>
    			<version>1.3.2</version>
    		</dependency>
    		
    		 
    	
    		<!-- Test -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    			<scope>test</scope>
    		</dependency>        
    	</dependencies>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-eclipse-plugin</artifactId>
                    <version>2.9</version>
                    <configuration>
                        <additionalProjectnatures>
                            <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                        </additionalProjectnatures>
                        <additionalBuildcommands>
                            <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                        </additionalBuildcommands>
                        <downloadSources>true</downloadSources>
                        <downloadJavadocs>true</downloadJavadocs>
                    </configuration>
                </plugin>
                <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>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2.1</version>
                    <configuration>
                        <mainClass>org.test.int1.Main</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

     

     

     

    테이블 생성과 Dummy(더미) 데이터 생성

     

    SQL Developer를 이용해서 book_ex 계정을 통해 테이블을 생성한다. 게시물은 각 게시물마다 고유의 번호가 필요하다. 오라클 경우 시퀀스(sequence)를 이용해 이런 작업을 처리한다. 

     

    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);
    
    
    select * from tbl_board;
    
    insert into tbl_board (bno, title, content, writer) 
    values (seq_board.nextval, '테스트 제목','테스트 내용','user00');
    
    commit;

     

     

    테이블 생성 후 'alter table'을 이용해 Primary Key 기본키를 지정해준다. Pk를 지정할 때 'pk_board'라는 이름을 지정하는데, 중요하게 사용되므로 반드시 의미를 구분할 수 있게 생성해주는게 좋다. 

     

     

    기본키까지 제약조건 생성했다면 더미 데이터의 추가로 num 자리에 seq_board.nextval 값을 넣어 매번 새로운 값들을 받아온다. 더미데이터까지 추가 완료 후 꼭 commit으로 커밋해줘야한다. 

     

     

    반응형

    댓글

Designed by Tistory.