๐Ÿ“Œ Spring Boot ํ™˜๊ฒฝ์—์„œ JSP, MyBatis, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ๋ฆ„ ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 5์›” 2์ผ
0

SPRING BOOT

๋ชฉ๋ก ๋ณด๊ธฐ
3/40
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-05-02


๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ Spring Boot ํ™˜๊ฒฝ ์„ค์ • (build.gradle)

โœ… ์ฃผ์š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ์˜์กด์„ฑ

plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '3.4.5'
	id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

	// JSP
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'

	// JSTL
	implementation 'jakarta.servlet:jakarta.servlet-api'
	implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
	implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'

	// Validation
	implementation 'org.hibernate.validator:hibernate-validator:8.0.2.Final'
	implementation 'jakarta.validation:jakarta.validation-api:3.1.1'

	// DB
	runtimeOnly 'com.mysql:mysql-connector-j'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'

	// Connection Pool
	implementation 'org.apache.commons:commons-dbcp2:2.13.0'
}

2๏ธโƒฃ application.properties ์„ค์ •

spring.application.name=demo
server.port=8090

# UTF-8 ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ
spring.servlet.filter.encoding.filter-name=encodingFilter
spring.servlet.filter.encoding.filter-class=org.springframework.web.filter.CharacterEncodingFilter
spring.servlet.filter.encoding.init-param.encoding=UTF-8
spring.servlet.filter.encoding.init-param.forceEncoding=true
spring.servlet.filter.encoding.url-pattern=/*

# JSP ๋ทฐ ์„ค์ •
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.servlet.jsp.init-parameters.development=true

# MySQL ์—ฐ๊ฒฐ ์ •๋ณด
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234

3๏ธโƒฃ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋น„๊ต

โœ… ๋กœ์ปฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: @ExceptionHandler (Controller ๋‚ด๋ถ€)

@Controller
@RequestMapping("/except")
@Slf4j
public class ExceptionTestController {

    @ExceptionHandler(Exception.class)
    public String handleAll(Exception e, Model model) {
        log.error("error: " + e);
        model.addAttribute("ex", e);
        return "except/error";
    }

    @GetMapping("/page01")
    public void triggerError() throws FileNotFoundException {
        throw new FileNotFoundException("ํŒŒ์ผ ์—†์Œ");
    }

    @GetMapping("/page02/{num}/{div}")
    public String divide(@PathVariable int num, @PathVariable int div, Model model) {
        model.addAttribute("result", num / div);
        return "except/page02";
    }
}

โœ… ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: @ControllerAdvice

@ControllerAdvice
@Slf4j
public class GolbalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleAllException(Exception e, Model model) {
        log.info("GlobalExceptionHandler's error : " + e);
        model.addAttribute("ex", e);
        return "global_error";
    }
}

4๏ธโƒฃ ์—๋Ÿฌ JSP ํŽ˜์ด์ง€ ๊ตฌ์„ฑ

โœ… except/error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %>
<html>
<body>
	<h1>EXCEPT/ERROR PAGE</h1>
	EXCEPTION : <%=exception %>
</body>
</html>

โœ… global_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %>
<html>
<body>
	<h1>GLOBAL_ERROR PAGE</h1>
	EXCEPTION : <%=exception %>
</body>
</html>

๐Ÿงญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ๋ฆ„ ์š”์•ฝ

[์š”์ฒญ]
   โ†“
[Controller ์‹คํ–‰ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ]
   โ†“
[๋กœ์ปฌ @ExceptionHandler ๋˜๋Š” ์ „์—ญ @ControllerAdvice ์ฒ˜๋ฆฌ]
   โ†“
[Model์— ์˜ˆ์™ธ ์ •๋ณด ์ „๋‹ฌ]
   โ†“
[JSP ์—๋Ÿฌ ํŽ˜์ด์ง€๋กœ ์‘๋‹ต ์ถœ๋ ฅ]

5๏ธโƒฃ JDBC ๋ฐ MyBatis ํ…Œ์ŠคํŠธ

โœ… tbl_memo ํ…Œ์ด๋ธ” ๊ตฌ์กฐ (์˜ˆ์‹œ)

CREATE TABLE tbl_memo (
  id INT PRIMARY KEY,
  content VARCHAR(255),
  email VARCHAR(255),
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

โœ… DataSource ํ…Œ์ŠคํŠธ

@SpringBootTest
public class DataSourceTests {

    @Autowired
    private DataSource dataSource;

    @Test
    @DisplayName("MySQL ์—ฐ๋™ ๋ฐ insert ํ…Œ์ŠคํŠธ")
    public void testInsert() throws Exception {
        Connection conn = dataSource.getConnection();
        PreparedStatement pstmt = conn.prepareStatement("insert into tbl_memo values(?,?,?,now())");
        pstmt.setInt(1, 111);
        pstmt.setString(2, "ababab");
        pstmt.setString(3, "springboot@test.com");
        pstmt.executeUpdate();
    }
}

โœ… SqlSessionFactory ํ…Œ์ŠคํŠธ

@SpringBootTest
class MybatisConfigTest {

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Test
    @DisplayName("MyBatis SqlSessionFactory & SqlSession ์ƒ์„ฑ ํ™•์ธ")
    public void testSqlSession() throws Exception {
        assertNotNull(sqlSessionFactory);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        assertNotNull(sqlSession);
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • Spring Boot๋Š” @SpringBootApplication ์•ˆ์— @ComponentScan์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ๋ณ„๋„ ์Šค์บ” ์„ค์ • ์—†์ด ์ž๋™ ํƒ์ƒ‰๋œ๋‹ค.
  • JSP๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ jakarta.servlet ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ • ํ•„์ˆ˜
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” @ExceptionHandler ๋˜๋Š” @ControllerAdvice ๋ฐฉ์‹์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ํ…Œ์ŠคํŠธ๋Š” DataSource ๋ฐ SqlSessionFactory ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ๋กœ ์ˆ˜ํ–‰
  • ์‹ค์ œ SQL ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์„ค์ • ์œ ํšจ์„ฑ๊นŒ์ง€ ํ™•์ธ ์™„๋ฃŒ!

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€