[ 프로젝트 이관 설계 ]
기존에 서블릿/JSP 기반으로 만들었던
AniMale 중간 프로젝트를 최종 프로젝트용으로
리빌딩하면서 Spring Boot 기반으로 전환했다.
이번 전환의 전제는 JSP를 유지하면서
War 방식으로 배포하는 구조다.
즉, 내장 톰캣 단독 실행(JAR)이 아니라
외부 톰캣에 War를 올려서 운영 가능한 형태로 맞췄다.
전환의 핵심은 다음 4가지였다.
- 설정을 부트 방식으로 통합
(pom.xml, application.properties) - JSP 뷰 구조 유지하되 경로 규칙을 부트 규칙으로 정리
- *.do 기반 호출 제거
+ 컨트롤러를 URL 매핑 방식으로 재구성 - DAO를 JdbcTemplate 기반으로 리팩터링
+ MySQL ERD 기준으로 DB 재정렬
전환 목표와 전제
목표
- 중간 프로젝트를 최종 프로젝트용으로 구조 정리
전제
- 뷰는 JSP 유지
- 배포는 War 기준(외부 톰캣 배포 전제)
- DB는 MySQL(스키마: animale_db)
1. 부트 프로젝트 제작
프로젝트 생성 시 통일한 기준
- 프로젝트명
: animale - 패키지명 초기값
: fourcheetah.animale - 부트 버전 통일
: 버전이 섞이면 빌드/의존성 충돌이
자주 발생하므로 시작 단계에서 고정


2. War 기반 설정 정리
War 기반에서 달라지는 포인트는 2개가 확실하다.
- pom.xml에서 톰캣 의존성 scope 처리
- 외부 톰캣 기동을 위한 ServletInitializer 필요
1) pom.xml 핵심 포인트
- spring-boot-starter-web 포함
- JSP 사용을 위한 jasper + jstl
- DB 사용을 위한 jdbc + mysql
- War 배포 전제라면 starter-tomcat을
provided로 두는 구성이 일반적
예시(pom.xml 핵심)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- War 배포 전제: 외부 톰캣 사용 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- JSP -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>
<!-- JDBC + MySQL -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
</dependencies>
2) ServletInitializer 추가(War에서 핵심)
War는 외부 톰캣이 애플리케이션을 기동한다.
이때 부트 애플리케이션이 톰캣 환경에서 시작되도록
연결해주는 클래스가 SpringBootServletInitializer다.
package fourcheetah.animale;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AnimaleApplication.class);
}
}
그리고 메인 클래스는 그대로 유지한다.
package fourcheetah.animale;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AnimaleApplication {
public static void main(String[] args) {
SpringApplication.run(AnimaleApplication.class, args);
}
}
3) application.properties로 설정 통합
War라고 해서 web.xml이 필수는 아니다.
Spring Boot 자동 구성 덕분에 DispatcherServlet 등록 등
기본 MVC 구성은 자동으로 잡히고
필요한 값만 properties로 지정하면 된다.
spring.application.name=animale
server.port=8088
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/animale_db?useSSL=false&serverTimezone=Asia/Seoul
spring.datasource.username=root
spring.datasource.password=비밀번호
spring.servlet.encoding.charset=UTF-8
spring.servlet.encoding.enabled=true
spring.servlet.encoding.force=true
정리하면, 기존 방식에서 web.xml과
각종 설정 파일이 담당하던 역할을
application.properties로 모으는 형태로 바뀐다.
3. V(View) 설정: JSP 유지 + 경로 규칙 정리
프론트 설정은 아래와 같이 2가지가 필수로 변경된다.
1) WEB-INF/views 구성
/WEB-INF/views/ 아래에 JSP를 둔다.
그 후 VR(뷰리졸버) prefix/suffix 설정으로
컨트롤러 return 문자열과 JSP 파일이 연결된다.
예시
- /WEB-INF/views/index.jsp
- /WEB-INF/views/main.jsp
- /WEB-INF/views/board.jsp
2) 공통 include 정리 (헤더/푸터)
<jsp:include page="/WEB-INF/common/header.jsp" />
<%@ include file="/WEB-INF/common/footer.jsp" %>
3) JSP 경로 재세팅(contextPath 통일)
상대경로는 페이지 깊이에 따라 깨지는 경우가 많아서,
contextPath를 잡고 전부 그 기준으로 통일했다.
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<link rel="stylesheet" href="${ctx}/css/style.css" />
<a href="${ctx}/anime/list">애니 리스트</a>
<form action="${ctx}/login" method="post"></form>
4. C(Controller) 설정: 패키지 분리 + .do 제거
클래스 파일을 묶어둘 패키지 명칭은
3단 규칙에 맞게 재설정하여 재정의하였다.
(fourcheetah.animale.web...)
1) 컨트롤러 패키지 분리
- fourcheetah.animale.web.controller.anime
- fourcheetah.animale.web.controller.board
- fourcheetah.animale.web.controller.common
- fourcheetah.animale.web.controller.member
- fourcheetah.animale.web.controller.news
- fourcheetah.animale.web.controller.util
2) *.do 호출 제거, URL 매핑 방식으로 전환
기존 FrontController에서 'command 값'으로
분기하던 흐름을 부트에서는 각 기능이
URL을 직접 가진 컨트롤러로 분리한다.
@Controller
@RequestMapping("/board")
public class BoardWriteController {
// 글쓰기 페이지 이동
@GetMapping("/write")
public String writePage() {
return "board/boardWrite"; // /WEB-INF/views/board/boardWrite.jsp
}
// 글쓰기 등록 처리
@PostMapping("/write")
public String write(BoardDTO dto) {
// service.insertBoard(dto);
return "redirect:/board/list"; // 등록 후 목록으로 이동
}
// 이제 한 컨트롤러에서 겟/포스트 요청을 모두 처리할 수 있다.
}
GET은 화면 이동(글쓰기 폼)
POST는 처리 로직(등록)으로
역할을 분리해 URL은 동일하게 유지했다.
- 포워드 성격: return 'viewName'
- 리다이렉트 성격: return 'redirect:/...'
- request.setAttribute 대신
model.addAttribute로 교체
5. M(Model) 설정: biz 구조 정리 + JdbcTemplate 기반 DAO 리팩터링
모델은 Jdbc템플릿 기반 형식으로 변경해야하고
인터페이스를 통한 DI를 활용해야 한다.
1) biz 패키지 구조
- fourcheetah.animale.web.biz.common
- fourcheetah.animale.web.biz.dto
> DTO, 서비스 인터페이스 - fourcheetah.animale.web.biz.impl
> 서비스 구현, DAO(JdbcTemplate 기반)
역할 구분 기준은 다음처럼 잡았다.
- DTO: 데이터 담는 객체
- Service: 비즈니스 흐름(트랜잭션 단위)
- DAO: SQL 실행과 매핑
2) JdbcTemplate 기반 DAO 예시
기존 JDBC 반복 코드를 템플릿으로 정리했다.
(Connection, PreparedStatement, ResultSet)
@Repository
public class BoardDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<BoardDTO> selectBoardList() {
String sql = "SELECT bid, title, writer, content, created_at FROM board ORDER BY bid DESC";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
BoardDTO dto = new BoardDTO();
dto.setBid(rs.getInt("bid"));
dto.setTitle(rs.getString("title"));
dto.setWriter(rs.getString("writer"));
dto.setContent(rs.getString("content"));
dto.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
return dto;
});
}
}
6. DB(MySQL) 기준 재정리: ERD 기반 스키마 생성과 쿼리 수정
DB는 오라클에서 MySQL로 변경했기 때문에
스키마와 쿼리문을 수정하였다.
1) 스키마 생성
CREATE DATABASE animale_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE animale_db;
2) 전환 시 자주 발생하는 수정 포인트
- 오라클 문법을 MySQL 문법으로 교체
- 시퀀스 기반 PK를 AUTO_INCREMENT로 전환
- 날짜 타입 통일(DATETIME/TIMESTAMP)
- FK/INDEX 제약조건 재정리
- DAO 쿼리 전반 점검(테이블명, 컬럼명, 예약어 충돌)
7. 이후 작업: JSP 전체에서 .do 호출 제거
부트 컨트롤러는 *.do를 쓰지 않기 때문에,
JSP 전반에서 링크/폼/ajax URL을 전부 점검했다.
점검 대상
- a href
- form action
- ajax url(fetch, $.ajax 등)
치환 예시
- 기존: /boardList.do
- 변경: /board/list
<a href="${ctx}/board/list">게시판</a>
<form action="${ctx}/member/login" method="post"></form>
<script>
fetch('${ctx}/news/list')
.then(r => r.json())
.then(data => console.log(data));
</script>
8. 전환 체크리스트
- 프로젝트 생성(프로젝트명/패키지/부트 버전 통일)
- War 설정(pom packaging, tomcat scope provided)
- ServletInitializer 추가
- application.properties 설정(VR, DB, 인코딩)
- WEB-INF/views 구성 + JSP 경로 ctx 기준 통일
- 컨트롤러 패키지 분리 + URL 매핑 방식으로 재구성
- JdbcTemplate 기반으로 DAO 리팩터링
- MySQL 스키마 생성 + ERD 기반 테이블 재구성
- JSP 전체에서 .do 호출 제거(링크/폼/ajax)
- 화면 이동 흐름(redirect/forward) 점검 + DB 쿼리 검증
[ 마무리 ]
이번 전환은 '부트로 바꿨다'에서 끝나는 작업이 아니라
배포 방식(War), 뷰(JSP), URL 정책(.do 제거),
DAO 구조(JdbcTemplate), DB(MySQL ERD)를
한 번에 정리하는 과정이었다.
특히 War 기반에서는 ServletInitializer와
tomcat scope 설정이 전환의 기준점이 된다.
'개주 훈련일지 > 🏋️ 전집중 호흡 훈련' 카테고리의 다른 글
| Git) Eclipse에서 push로 GitHub에 공유하기 (0) | 2026.02.05 |
|---|---|
| Git) Eclipse에서 Git 연결 후 커밋까지 진행해보기 (0) | 2026.02.03 |
| 카카오페이 결제 승인 응답 전달 방식 개선(PRG) (0) | 2026.01.06 |
| 이메일 인증 완료 후 비밀번호 변경까지 - Ajax 3단계 + 최종 ResetAction 적용기 (0) | 2025.12.31 |
| 비밀번호 찾기 UX 개선: 아이디 확인 → 이메일 자동 세팅 → 인증코드 발송(AJAX/Servlet) (0) | 2025.12.31 |