Spring MyWeb 새 프로젝트 생성

정원·2022년 6월 17일

Spring-MyWeb

목록 보기
1/16

22.06.17 마지막 프로젝트 ㅠ.ㅠ

스프링 레거시 프로젝트 생성

pom.xml 설정 변경

<?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.spring</groupId>
	<artifactId>myweb</artifactId>
	<name>MyWeb</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	
	<!-- 자바버전,스프링 버전 변경 -->
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.3.18</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.15</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 -->
		<!-- 참조하는 서블릿 버전 3.1.0 선언(artifact id가 달라요) -->
		<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 버전을 4.12로 변경-->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		
		
	  <!-- spring-jdbc -->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>${org.springframework-version}</version>
      </dependency>

      <!-- HikariCP: 커넥션 풀 -->
      <dependency>
         <groupId>com.zaxxer</groupId>
         <artifactId>HikariCP</artifactId>
         <version>3.3.1</version>
      </dependency>

      <!-- ojdbc6 DB 커넥터 드라이버 -->
      <dependency>
         <groupId>com.oracle.database.jdbc</groupId>
         <artifactId>ojdbc6</artifactId>
         <version>11.2.0.4</version>
      </dependency>

      <!-- mybatis 라이브러리 -->
      <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.4.6</version>
      </dependency>

      <!-- mybatis와 spring을 연동해 주는 api -->
      <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
         <version>1.3.2</version>
      </dependency>

      <!-- spring-test 모듈 -->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-test</artifactId>
         <version>5.3.18</version>
         <scope>test</scope>
      </dependency>

      <!-- lombok 라이브러리 추가 -->
      <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <version>1.18.24</version>
         <scope>provided</scope>
      </dependency>

      <!-- jackson-databind: 데이터를 JSON형태로 파싱해 주는 라이브러리. -->
      <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.12.3</version>
      </dependency>

      <!-- spring-security-web -->
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-web</artifactId>
         <version>5.3.13.RELEASE</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>
            
            <!-- 메이븐 컴파일러 버전 3.5.1 변경, 자바 버전도 맞게 변경. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</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>

메이븐 업데이트진행

freeBoard

테이블 생성

CREATE TABLE freeboard(
    bno NUMBER(10, 0),
    title VARCHAR2(300) NOT NULL,
    writer VARCHAR2(50) NOT NULL,
    content VARCHAR2(2000) NOT NULL,
    regdate DATE DEFAULT sysdate,
    updatedate DATE DEFAULT NULL
);

ALTER TABLE freeboard
ADD CONSTRAINT freeboard_pk PRIMARY KEY(bno);

CREATE SEQUENCE freeboard_seq
    START WITH 1
    INCREMENT BY 1
    MAXVALUE 5000
    NOCYCLE
    NOCACHE;

FreeBoardVO 생성

newMark 여부 판단 변수도 함께 선언.

package com.spring.myweb.command;

@Getter
@Setter
@ToString
public class FreeBoardVO {

	private int bno;
	private String title;
	private String writer;
	private String content;
	private Timestamp regDate;
	private Timestamp updateDate;
	private boolean newMark;	
}

PageVO

검색에 필요한 변수도 함께 선언.

package com.spring.myweb.util;

@Getter
@Setter
@ToString
public class PageVO {
	
	//사용자가 선택한 페이지 정보를 담을 변수
	private int pageNum;
	private int cpp;
	
	//검색에 필요한 데이터를 변수로 선언
	private String keyword;
	private String condition;
	
	public PageVO() {
		this.pageNum = 1;
		this.cpp = 20;
	}
}

PageCreator

페이징 알고리즘 실행 클래스.
URI 파라미터 쉽게 만들어주는 makeURI메서드도 선언.

<script>
package com.spring.myweb.util;

@Getter
@Setter
@ToString
public class PageCreator {
	
	private PageVO paging;
	private int articleTotalCount;
	private int endPage;
	private int beginPage;
	private boolean prev;
	private boolean next;
	   
	private final int buttonNum = 5;
	   
	//URI 파라미터를 쉽게 만들어주는 유틸 메서드 선언
	public String makeURI(int page) { //현재 사용자가 선택한 페이지
			UriComponents ucp = UriComponentsBuilder.newInstance()
            								.queryParam("page", page)
                                            .queryParam("cpp", paging.getCpp())
                                            .queryParam("keyword", paging.getKeyword())                                              .queryParam("condition", paging.getCondition())
											.build();
			return ucp.toUriString();
	}
	   
	private void calcDataOfPage() {
	      
		endPage = (int) (Math.ceil(paging.getPageNum() / (double) buttonNum) * buttonNum);
	      
		beginPage = (endPage - buttonNum) + 1;
	      
		prev = (beginPage == 1) ? false : true;
	      
		next = articleTotalCount <= (endPage * paging.getCpp()) ? false : true;
	      
	      if(!next) {
	         endPage = (int) Math.ceil(articleTotalCount / (double) paging.getCpp()); 
	      }	      
	   }
	   
	   //컨트롤러가 총 게시물의 개수를 PageCreator에게 전달한 직후에 
	   //바로 페이징 버튼 알고리즘이 돌아갈 수 있도록 setter를 커스텀.
	   public void setArticleTotalCount(int articleTotalCount) {
	      this.articleTotalCount = articleTotalCount;
	      calcDataOfPage();
	   }
}
</script>

IFreeBoardMapper

package com.spring.myweb.freeboard.mapper;

public interface IFreeBoardMapper {
	
	//글 등록
	void regist(FreeBoardVO vo);
	
	//글 목록
	List<FreeBoardVO> getList(PageVO vo);
	
	//총 게시물 수
	int getTotal(PageVO vo);
	
	//상세보기
	FreeBoardVO getContent(int bno);
	
	//글 수정
	void update(FreeBoardVO vo);
	
	//글 삭제
	void delete(int bno);
}

servlet-config

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 자동으로 컨트롤로와 매핑 메서드 탐색 (핸들러 매핑, 핸들러 어댑터 빈 등록) -->
	<annotation-driven />
	
	<!-- css, img, js..의 파일 경로가 복잡할 때 많이 사용한다. -->
	<!-- jsp파일 같은 데서 경로 긴거 일일히 쓰기 귀찮아서 선언한다.
		내부 경로를 숨겨주는 역할도 한다. -->
	<resources mapping="/resources/**" location="/resources/" />
	<resources mapping="/img/**" location="/resources/img/" />
	<resources mapping="/css/**" location="/resources/css/" />
	<resources mapping="/fonts/**" location="/resources/fonts/" />
	<resources mapping="/js/**" location="/resources/js/" />
	
	
	<!-- 컨트롤러가 리턴한 문자열 앞,뒤에 적절한 경로를 붙여서 화면을 응답할 수 있도록 도와주는 뷰 리졸버 -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<!-- 아노테이션으로 등록된 클래스 객체들을 탐색해주는 설정 태그.
		base-package에다가는 탐색할 패키지 경로를 쓰면 하위 패키지까지 몽땅 검색해 준다. -->
	<context:component-scan base-package="com.spring.myweb" />
</beans:beans>

web.xml

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/config/db-config.xml</param-value>
</context-param>
...
<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/servlet-config.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
...
<!-- 스프링 한글처리 -->
<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>
		org.springframework.web.filter.CharacterEncodingFilter
	</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<!-- 위에 지정한 encodingFilter이름을 모든 패턴에 적용 -->
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

Hikari.properties

프로젝트를 구성하다 보면 자주 변경되지 않는 설정 파일들이나 공통 정보들에 대한
내용이 존재하게 되고, 그 내용들은 한 번 지정되면 잘 바뀌지 않는다.
이런 경우에는 .properties 라는 파일을 사용하여 텍스트 형식으로 간단히 지정하고
필요할 때 불러와서 사용하는 방식을 많이 사용한다.
DB에 맞게 url, id, pw를 저장 해놓고 필요한 곳에서 호출해서 사용.

## local oracle
ds.driverClassName = oracle.jdbc.driver.OracleDriver
ds.url = jdbc:oracle:thin:@localhost:1521:xe
ds.username = spring
ds.password = spring

## local mysql
mydb.driverClassName = com.mysql.cj.jdbc.driver
mydb.url = jdbc:mysql://localhost:3306/spring
mydb.username = myspring
mydb.password = myspring

db-config.xml

.properties 등록한 파일을 호출해서 사용.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- JDBC, DB 관련 빈을 등록하고 관리하는 설정 파일 -->
    
	<!-- 외부에 따로 설정한 설정파일을 참조하는 곳에 사용하는 클래스 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:/db-config/Hikari.properties"/>
	</bean>
	
	<!-- 히카리 커넥션 풀 빈 등록 -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="${ds.driverClassName}" />
		<property name="jdbcUrl"
			value="${ds.url}" />
		<property name="username" value="${ds.username}" />
		<property name="password" value="${ds.password}" />
	</bean>

	<!-- 히카리 데이터소스 빈 등록 -->
	<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikariConfig" />
	</bean>

	<!-- 마이바티스 SQL 동작을 위한 핵심 객체 SqlSessionFactory 클래스 빈 등록 -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="ds" />
		
		<!-- 마이바티스 같은 경우는 mapper 구현체를 xml로 대체하니까 해당 구현제 xml 파일의 경로를 알려줘야 한다.
		와일드 카드 매핑을 이용해서 규칙을 설정. -->		
		<property name="mapperLocations"
			value="classpath:/mappers/*.xml" />
	</bean>

	<!-- 지정한 패키지를 스캔하여 존재하는 mapper 인터페이스를 빈 타입으로 등록. 나중에 sqlSessionFactory가 
		xml파일을 클래스로 변환하여 빈으로 등록하려는 시도를 할 때 타입을 지정해 줘야 하기 때문. -->
	<mybatis-spring:scan
		base-package="com.spring.myweb.freeboard.mapper" />

</beans>

0개의 댓글