프로젝트 실습

cy8erpsycho·2023년 8월 29일
0

스프링

목록 보기
16/29
post-thumbnail

웹어플리케이션이 deploy되지 않은 상태에서 작업을 시작한다.

보통 컨트롤러를 탑레벨 패키지로 주는 것이 일반적이다.

1. context path 수정

이 프로젝트의 시작은 /로부터 시작하도록 설정한다.

클라이언트가 주소만 치고 들어온다는 이야기는 context path가 / 로 잡혀있다는 것으로 인식할 수 있다.

2. xml 수정

인코딩(<filter> 추가)

필터는 어떤작업을 실행할때 먼저 수행되는 서블릿이라고 인식할 수 있다. 다음의 태그들은 필터의 가장 중요한 태그이다.

<filter-name>

필터의 이름은 마음대로 주어도 상관없지만 <filter>의 이름과 <filter-mapping>의 이름은 동일해야 한다.

<filter-class>

필터를 생성하는데 필요한 데이터이다. 스프링 내에 자체적으로 정해져있다. 클래스가 정의되어 있기 때문에 오타가 나면 필터가 동작하지 않는다.

<init-param>

<param-name>

값이 정해져 있다. 마음대로 이름을 정할 수 없다는 뜻이다. encoding, forceEncoding 등이 있다.

<param-value>

UTF-8, true 같이 정해져있다.

<filter-mapping>

어떤 필터를 사용할 것인지 필터의 이름과, 어떤 url에 대한 동작을 책임지는지에 대한 정보가 들어있다.



3. pom.xml 수정

버전을 맞추고, <dependency>를 추가한다.

<?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>com.zerock</groupId>
	<artifactId>controller</artifactId>
	<name>bbs</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<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>
	<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>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<!-- <scope>runtime</scope> -->
		</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>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>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>   
		
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.0</version>
		    <scope>provided</scope>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>5.0.7.RELEASE</version>
	<!-- 	    <scope>test</scope> -->
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>5.0.7.RELEASE</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>
		
		<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
		<dependency>
		    <groupId>com.zaxxer</groupId>
		    <artifactId>HikariCP</artifactId>
		    <version>2.7.8</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
		<dependency>
		    <groupId>org.bgee.log4jdbc-log4j2</groupId>
		    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
		    <version>1.16</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
		<dependency>
		    <groupId>com.oracle.database.jdbc</groupId>
		    <artifactId>ojdbc8</artifactId>
		    <version>19.3.0.0</version>
		</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>

<groupId>

<artifactId>

내가 만든 프로젝트의 고유 아이디이다. 탑패키지를 써서 아이디를 설정할 수 있다.

<packaging>

war의 압축포맷으로 배포하겠다는 의미이다

<java-version>

자바 버전

<org.springframework-version>

버전 5 이상을 쓴다.

aspectj - 사용하고 있는 모듈에 대한 번호 수정하지 않아도 된다.

<org.apache.maven.plugins>

11로 변경

log4j

최소한 1.2.17 버전이상을 쓴다.

servlet-api

artifactId에 javax 추가 version 3.1.0

4. 필요한 모듈 추가

db에 대한 추가, 테스트에 대한 추가, 제일 먼저 필요한것은 스프링에 대한 부분이다. <!--SPRING --> 부분에 추가한다. spring-test추가(spring-core는 미리 추가가 되어있으므로 상관이 없다)

jdbc를 추가하면 spring-tx가 추가된다.

spring-test, spring-jdbc

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>${org.springframework-version}</version>
	<!-- 	    <scope>test</scope> -->
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>

myBatis

Compilge Depencies에 필수 요소가 없다.

myBatis-spring

위의 항목이 모두 필수임을 알 수 있다. myBatis-spring의 dependeny를 추가해도 myBatis dependency는 자동으로 추가되지 않으므로 수동으로 추가한다.

커넥션 풀(HikariCp)

slf4j-api가 이미 스프링내에 추가되어 있기 때문에 추가 안해도된다.

Oracle JDBC 추가

log4jdbc-log4j2

개발할 때 코드의 흐름을 추적하기 위해 설치한다.

여기서 deligater로 properties를 추가해준다. log4j와 같이 쓰는 것이기때문에 같은 경로에 추가한다.

lombok

getter() setter() hashcode() toString() 편하게 작업할 수 있게한다.

5. home.jsp

인코딩관련코드 추가한다.

<%@ page session="false" language="java" contentType="text/html; charset=UTF-8" 
	pageEncoding="UTF-8"%>


6. Front 작업

header footer넣기

7. mapper 작업

Mapper Interface 생성

메소드를 작성한 후 , 별도로 쿼리를 .xml로 관리하는 것이 좋다.

  • SELECT : List<> 형태로 받아오게 한다.

DTO 생성

java beans 형태를 띄고있는 DTO 생성한다.
DB 테이블과 매핑을 해서 멤버변수를 작성한다.
SELECT를 했을때 모든 데이터를 받아오는 역할을 한다.

.XML 생성

.xml 파일은 src/main/resources 경로에 패키지를 생성해서 추가한다.

mapper의 namespace에 패키지명과 인터페이스 이름을 다음과 같이 써준다.

위와 같이 패키지 이름을 같이 써주는 것을 FQN(Fully Qualified Name)이라 한다.

쿼리작성

select의 필수 속성으로 id가 있다. 이는 Mapper에 작성된 메소드명과 동일하게 해야 한다. resultType은 리턴으로 받는 형식을 말한다. resultType 역시 패키지명을 포함해서 FQN 형식으로 작성한다.

위와 같이 작성한다.

그런데 여기에는 하나의 문제가 있다. 태그 안에 존재하는 부등호는 XML 파일내에서 태그의 일부로 생각하기 때문에 파싱하는 도중 오류가 생길 수가 있다. 이를 해결하기 위해서 C DATA SECTION이라는 것을 쓸 수 있다. <![CDATA[]]> 는 이 영역 안에 있는 내용은 태그로 인지하지 말고 그냥 문자열로 처리해주세요 라는 뜻이다.

ROOT-CONTEXT.XML 작성

JDBC 드라이버 추가

<bean>의 속성 중 id는 아무값이나 줘도 상관없지만 다른 곳에서 이곳을 참조할 때는 id를 동일하게 줘야 한다.
class명은 패키지를 포함해서 작성한다.
<bean> 내의 <property> 는 추가정보를 뜻한다.
<property>의 name 은 정해진 값이 있다. value 속성은 FQN형식으로 작성한다.

	<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="book_ex"></property>
		<property name="password" value="book_ex"></property>
	</bean>

value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE">에서

jdbcURL에 접속하는 것이 username과 password 부분이다. 그런데 이와 같이 평문의 형태로 써져 있으면 보안에 취약하다. 회사에서는 이를 암호화해서 저장한다.

빈을 생성할때 아래와 같이 툴을 이용하면 오타의 염려가 없다.

커넥션 풀

	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close" primary="false">	
		<constructor-arg ref="hikariConfig"></constructor-arg>
	</bean>

id와 참조id가 같아야한다

<mybatis-spring:scan base-package="com.zerock.mapper"/>

namespace에서 체크

myBatis를 사용하기 위함임
아래 코드를 root-context.xml에 추가

테스트 케이스 생성

--

@Service

서비스를 할 수 있는 빈을 스프링에게 알려줘야한다.

namespace에 context 부분 체크 후

<context:component-scan base-package="com.zerock.service" />

root-context.xml에 추가

테스트 케이스 추가하기

Junit 테스트는 스프링 내의 @SpringJUnit4ClassRunner을 써야한다.
root-context가 어디있는지 알려주는 @ContextConfiguration을 추가한다

0개의 댓글