Spring + JSP 프로젝트 패키지 폴더 구조 설계
Spring 프로젝트 패키지 설계
Java 폴더 구조
src.main.java.com.도메인명
├─ global 또는 common // 공통
│ ├─ config // 전역 설정
│ │ ├─ AppConfig.java
│ │ ├─ WebConfig.java // 인터셉터 등록
│ │ ├─ DataSourceConfig.java
│ │ └─ SecurityConfig.java
│ │ └─ interceptor
│ │ ├─ AuthInterceptor.java
│ │ └─ LoggingInterceptor.java
│ │
│ ├─ exception // 에러 처리
│ │ ├─ GlobalExceptionHandler.java
│ │ ├─ CustomException.java
│ │ └─ ErrorResponse.java
│ │
│ └─ util // 유틸
│ ├─ DateUtils.java
│ └─ StringUtils.java
│
└─ user // 비즈니스 도메인 폴더 1
├─ domain
│ └─ User.java // DB 테이블 1:1 매핑 VO 객체
│ └─ UserResultSet.java // 내부 처리용 DB 조회 결과 객체 (페이징/집계 등)
│
├─ dto
│ ├─ UserRequestDto.java // 생성/수정 요청용 DTO
│ └─ UserResponseDto.java // 클라이언트 반환용 DTO
│ └─ UserCondition.java // 조회 시 검색조건 전달용 DTO
│
├─ mapper
│ └─ UserMapper.java // Mybatis Mapper (DB 전용)
│ └─ dto
│ └─ UserResponseMapper.java // MapStruct Mapper (응답 VO → DTO 변환용)
│ └─ UserRequestMapper.java // MapStruct Mapper (요청 DTO → VO 변환용)
│
├─ repository // mapper 사용 시 DAO 미사용
│ └─ UserDao.java
│
├─ service
│ ├─ UserService.java
│ └─ impl
│ └─ UserServiceImpl.java
│
└─ controller
└─ UserController.java
스프링 MVC 구조를 도메인 단위로 분리하여 DDD (Domain-Driven Design) 원칙을 반영한 설계입니다.
파일이 많아지면 각 폴더 내부에서 역할/기능 단위로 세분화하는 것도 좋습니다.
VO별 Condition이 아닌 공통 Condition 사용 시, Service 레이어에서 VO로 변환이 권장됩니다.
데이터 객체 설계 종류
| Entity 또는 VO (Value Object) |
DB 테이블과 매핑되는 비즈니스 도메인 핵심 객체 비즈니스 로직 포함 가능 JPA 환경에서는 Entity 사용 JDBC, MyBaties 환경에서는 VO 사용 |
| DTO (Data Transfer Object) |
Controller ↔ Service 간 데이터 전달용 객체 주로 Request DTO, Response DTO 분리 Entity 또는 VO 데이터 직접 노출을 막기 위해 사용 |
| Condition | 데이터 조회 시 검색조건 파라미터 전달용 객체 |
| Mapper | DTO ↔ Entity 또는 VO 변환 담당 객체 |
| DAO (Data Access Object) |
JDBC, MyBaties에서 사용되는 데이터베이스 접근 전용 객체 스프링에서는 @Repository로 구현 JPA 환경에서는 Repository가 DAO 역할 대체 가능 MyBatis 환경에서는 Mapper 인터페이스가 DAO 역할 대체 가능 |
JSP 기반 프론트 구조
src.main.webapp
└─ WEB-INF
├─ views // JSP 페이지 폴더
│ ├─ common // 공통 JSP (header, footer, layout 등)
│ ├─ user // 비즈니스 도메인 폴더 1
│ │ ├─ list.jsp
│ │ ├─ detail.jsp
│ │ └─ form.jsp
│ └─ post // 비즈니스 도메인 폴더 2
│ ├─ list.jsp
│ ├─ detail.jsp
│ └─ write.jsp
│
├─ layouts // 템플릿 레이아웃 (Tiles, Sitemesh, include 기반)
├─ jspf // JSP fragment (공통 include용 JSP)
├─ error // 에러 페이지 (404.jsp, 500.jsp)
└─ web.xml // 디스패처 설정
JSP 파일은 보안상 외부에서 접근할 수 없는 WEB-INF 폴더에 위치해야 합니다.
views 폴더는 도메인별로 분리하고, 사용자/메뉴별 하위 폴더를 생성하는 것도 좋습니다.