프로젝트 생성
```
demo/
├─ pom.xml # Maven 프로젝트 의존성과 빌드 설정 파일
└─ src/
├── main/
│ └── java/
│ └── com/demo/ # 자바 소스 기본 패키지
│ ├── web/
│ │ └── LoginController.java # 로그인 요청 처리하는 Spring MVC 컨트롤러
│ ├── dto/
│ │ └── LoginReqeustDTO.java # 로그인 요청 DTO
│ │ └── LoginResponseDTO.java # 로그인 응답 DTO
│ ├── service/
│ │ └── LoginService.java # 로그인 서비스 인터페이스 (비즈니스 로직 정의)
│ ├── service/impl/
│ │ └── LoginServiceImpl.java # 로그인 서비스 구현체 (DB 조회 등 실제 로직 수행)
│ └── mapper/
│ └── UserMapper.java # MyBatis 매퍼 인터페이스 (쿼리 메서드 선언)
│
├── resources/
│ ├── context-datasource.xml # Spring의 DB 및 MyBatis 설정 (DataSource, SqlSessionFactory 등)
│ ├── mybatis-config.xml # MyBatis 전역 설정 파일 (카멜케이스 매핑 등)
│ └── mapper/
│ └── UserMapper.xml # 실제 SQL 정의가 들어있는 MyBatis 매퍼 XML
│
└── webapp/ # 웹 애플리케이션 루트 (정적 자원 및 JSP)
├── index.jsp # 기본 시작 페이지 (예: 로그인 페이지로 redirect)
├── WEB-INF/
│ ├── web.xml # 서블릿 설정 (DispatcherServlet 등록, 필터 설정 등)
│ ├── config/
│ │ └── egovframework/
│ │ └── springmvc/
│ │ └── dispatcher-servlet.xml # Spring MVC 설정 (component-scan, ViewResolver 등)
│ └── lib/ # 수동으로 JAR을 추가할 때 사용하는 디렉토리 (보통 Maven이면 비어 있음)
└── views/
├── login.jsp # 로그인 화면 JSP
└── main.jsp # 로그인 성공 시 이동하는 메인 페이지 JSP
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
property name="url" value="jdbc:mysql://localhost:3307/test_db?serverTimezone=Asia/Seoul"/>
property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
id="dataSource"
: 다른 설정에서 이 DataSource를 참조할 수 있도록 ID 지정BasicDataSource
: Apache DBCP2의 커넥션 풀 클래스driverClassName
: MySQL 8.x 드라이버 클래스url
: DB 주소 (localhost:3307
, DB명은 test_db
)serverTimezone=Asia/Seoul
: 시간 오류 방지username
/password
: DB 로그인 정보<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
MyBatis
와 Spring
을 연결하는 핵심 설정dataSource
: 위에서 정의한 DataSource를 주입configLocation
: 전역 MyBatis 설정 파일 (src/main/resources/mybatis-config.xml
)mapperLocations
: SQL 정의가 담긴 XML 파일 경로```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
```
```c
<setting name="mapUnderscoreToCamelCase" value="true"/>
```
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 컨트롤러 스캔 경로 -->
<context:component-scan base-package="com.demo" />
<import resource="classpath*:mybatis-config.xml"/>
<import resource="classpath:context-datasource.xml" />
<!-- 뷰 리졸버 설정 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 애노테이션 기반 설정 -->
<mvc:annotation-driven />
</beans>
<context:component-scan base-package="com.demo" />
<import resource="classpath*:mybatis-config.xml"/>
<import resource="classpath:context-datasource.xml" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
return "login"
→ /WEB-INF/views/login.jsp
로 매핑됨<mvc:annotation-driven />
@RequestMapping
, @GetMapping
, @PostMapping
등 어노테이션이 동작하도록 설정RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
등이 등록됨HttpMessageConverter
) 등도 자동 등록됨<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- MyBatis-Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
com.mysql.cj.jdbc.Driver
와 함께 써야 함UserMapper.xml
과 UserMapper.java
같은 매퍼 구조를 통해 SQL → 객체 자동 바인딩을 처리SqlSessionFactoryBean
, MapperScannerConfigurer
등의 Spring bean 설정에서 사용됨<c:if>
, <c:forEach>
, <c:url>
등 JSTL 태그를 사용하기 위한 라이브러리login.jsp
, main.jsp
같은 JSP에서 조건 분기, 반복, URL 처리 등 템플릿 기능 제공