[spring] Spring Boot

sang·2024년 4월 29일

Spring Boot

스프링 부트
스프링 프레임워크보다 편리

자동 의존성 관리
쉽고 빠른 테스트 및 배포
설정 과정 단순화, 환경 설정 자동화
라이브러리 자동 업데이트 가능
프로젝트 환경 툴 내장 (Tomcat, Jetty, UnderFlow 등 설치 불필요)


myboot01/src/main/resources/application.properties

톰캣 서버 설정

#Server
server.port=8090 #포트번호
server.session.timeout=360000 #유효시간

myboot01/src/main/java/com/myboot01/Myboot01Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication //스프링부트 설정
public class Myboot01Application {
  public static void main(String[] args) { //main 메소드 필수
    SpringApplication.run(Myboot01Application.class, args);
  }
}

myboot01/src/main/java/com/myboot01/DemoController.java

package com.myboot01;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DemoController {
  @ResponseBody
  @RequestMapping("/") //모든 요청
  public String home() {
    System.out.println("Hello Boot!!"); //콘솔 출력
    return "Hello Boot!!"; //브라우저 출력
  }
}

myboot01/src/main/java/com/myboot01/ServletInitializer.java

web.xml없이 톰캣 실행

...

public class ServletInitializer extends SpringBootServletInitializer {
...


화면 구현 방식

JSP

myboot01/pom.xml

...
<!-- JSP 관련 라이브러리 설정 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
  <scope>provided</scope>
</dependency>
...

myboot01/src/main/resources/application.properties

#Server
server.port=8090
server.session.timeout=360000

#Spring MVC 
#JSP 파일 위치 설정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

myboot01/src/main/webapp/WEB-INF/views/hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>

<html>
<head>
  <script src="${contextPath}/js/scriptTest.js" type="text/javascript"></script> <!-- js file -->
  <meta charset="utf-8">
  <title>hello.JSP 페이지</title>
</head>
<body>
  안녕하세요 <br>
  <h2>${message}</h2>
  <img width=200 height=200 src="${contextPath}/image/duke3.png" /> <br/>
  <input type="button" name="테스트" value="테스트" onClick="test();">
</body>
</html>

thymeleaf

타임리프
간결하게 구현하는 화면
빠르고 쉬운 스프링 연동

JSP가 아닌 순수 HTML을 사용하면서 동적인 동작을 가능하게 함

myboot01/pom.xml

...
<!-- 타임리프 관련 라이브러리 설정 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
...

myboot01/src/main/java/com/myboot01/DemoController.java

...
@Controller
public class DemoController {
  @ResponseBody
  @RequestMapping("/")
    public String home(){
    System.out.println("Hello Boot!!");
    return "Hello Boot!!";
  }
  @RequestMapping("/hello.do")
    public String hello(Model model){
    System.out.println("안녕하세요");
    model.addAttribute("message","hello.html입니다.!");
    return "hello";
  }
}

myboot01/src/main/resources/static/scriptTest.js

function test() {
  alert("thymeleaf 테스트입니다");
}

myboot01/src/main/resources/templates/hello.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- 타임리프 사용 설정 -->
<head>
<script src="/js/scriptTest.js" type="text/javascript"></script> <!-- js file -->
  <meta charset="utf-8" />
  <title>hello.html입니다.</title>
</head>

<body>
  <h1> thymeleaf 테스트입니다.</h1>
  <div th:text="${message}"></div>
  <img src="/image/duke3.png" width="200" height="200" /><br>
  <input type="button" name="테스트" value="테스트" onClick="test()" />
</body>


Gradle

groovy 스크립트 기반 동적 빌드 기능 제공
메이븐보다 간단한 빌드 작업, 편리한 기능 추가 가능

Gradle 프로젝트 구조

  • 프로젝트명
    • src
      • main
        • java
          • com.example
            • common.tiles: TilesConfig.java
            • (package): controller, dao, vo, service
            • ProjectApplication.java
        • resource
          • templates
          • static
            • css
            • image
            • js
          • application.properties
      • test
    • JRE System Library
    • Project and External Dependencies
    • bin
    • gradle
    • libs
    • src
      • main
        • webapp
          • WEB-INF
            • tiles
            • views: jsp files
              • common: tiles jsp files (footer, header, layout, side)
    • build.gradle
    • gradlew
    • gradlew.bat
    • settings.gradle

myboot02/build.gradle

pom.xml 역할

buildscript {
  ext { springBootVersion = '2.0.6.RELEASE' }
  repositories { mavenCentral() }
  dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.myboot02'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
  mavenCentral()
}

dependencies {
  implementation('org.springframework.boot:spring-boot-starter-jdbc')
  implementation('org.springframework.boot:spring-boot-starter-web')
  implementation('org.apache.tomcat.embed:tomcat-embed-jasper') //톰캣 사용 설정
  implementation('javax.servlet:jstl:1.2') //JSP 사용 설정
  runtimeOnly('com.h2database:h2')
  testImplementation('org.springframework.boot:spring-boot-starter-test')
}

myboot02/src/main/resources/application.properties

#Server
server.port=8090
server.session.timeout=360000
#Spring MVC
spring.mvc.view.prefix=/WEB-INF/views/ #jsp file path
spring.mvc.view.suffix=.jsp


MyBatis

사용 방식

  • 이전 MyBatis
    interface DAO { abstract method; }
    class MemberDAOImpl implements interface { sqlSession -> mapper SQL }

  • Spring Boot MyBatis
    interface DAO { abstract method; }
    service { method -> mapper SQL }
    MemberDAOImpl.java 불필요

myboot03/libs/ojdbc6.jar

oracle database driver

myboot03/build.gradle

  ...
  dependencies {
    implementation('org.springframework.boot:spring-boot-starter-jdbc')
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
    
    /* jsp 사용 설정 */
    implementation('org.apache.tomcat.embed:tomcat-embed-jasper')
    implementation('javax.servlet:jstl:1.2')
    
    /* oracle driver */
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation files('libs/ojdbc6.jar')
    runtimeOnly('com.h2database:h2')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
  }
  ...

myboot03/src/main/resources/application.properties

#Server
server.port=8090
server.session.timeout=360000

#Spring MVC
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#Database config
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=scott
spring.datasource.password=tiger
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver

#mybatis config
mybatis.config=classpath:mybatis-config.xml
mybatis.type-aliases-package=com.myboot03.member.vo #memberVO package

myboot03/src/main/resources/mybatis-config.xml

  ...
  <configuration>
    <mappers>
      <!-- mapper path -->
      <mapper resource="mybatis/mappers/member.xml"/>
      <!-- <mapper resource="mybatis/mappers/board.xml"/> -->
    </mappers>
  </configuration>

myboot03/src/main/resources/mybatis/mappers/member.xml

...
<mapper namespace="com.myboot03.member.dao.MemberDAO">
  <resultMap id="memResult" type="memberVO">
    <result property="id" column="id" />
    <result property="pwd" column="pwd" />
    <result property="name" column="name" />
    <result property="email" column="email" />
    <result property="joinDate" column="joinDate" />
  </resultMap>

  <select id="selectAllMemberList" resultMap="memResult">
      <![CDATA[
        select * from t_member order by joinDate desc
      ]]>
  </select>
  
  <insert id="insertMember" parameterType="memberVO">
      <![CDATA[
        insert into t_member(id,pwd, name, email)
        values(#{id}, #{pwd}, #{name}, #{email})
      ]]>
  </insert>
  ...

myboot03/src/main/java/com/myboot03/member/controller/MemberControllerImpl.java

...
@Controller("memberController")
public class MemberControllerImpl implements MemberController {
  @Autowired
  private MemberService memberService;
  @Autowired
  private MemberVO memberVO ;

  @Override
  @RequestMapping(value= "/member/listMembers.do", method = RequestMethod.GET)
  public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //String viewName = (String)request.getAttribute("viewName");
    List membersList = memberService.listMembers();
    //ModelAndView mav = new ModelAndView(viewName);
    ModelAndView mav = new ModelAndView("/member/listMembers");
    mav.addObject("membersList", membersList);
    return mav;
  }
  ...

myboot03/src/main/java/com/myboot03/member/dao/MemberDAO.java

...
@Mapper
@Repository("memberDAO")
public interface MemberDAO {
  /* mapper file SQL */
  public List selectAllMemberList() throws DataAccessException;
  public int insertMember(MemberVO memberVO) throws DataAccessException ;
  public int deleteMember(String id) throws DataAccessException;
  public MemberVO loginById(MemberVO memberVO) throws DataAccessException;
}


Tiles

myboot03/build.grade

...
dependencies {
  implementation('org.springframework.boot:spring-boot-starter-jdbc')
  implementation('org.springframework.boot:spring-boot-starter-web')
  implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
  implementation('org.apache.tomcat.embed:tomcat-embed-jasper')
  implementation('javax.servlet:jstl:1.2')
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation files('libs/ojdbc6.jar')
  implementation('org.apache.tiles:tiles-jsp:3.0.4') <!-- tiles 사용 설정 -->

  runtimeOnly('com.h2database:h2')
  testImplementation('org.springframework.boot:spring-boot-starter-test')
}

myboot03/src/main/java/com/myboot03/common/tiles/TilesConfig.java

...
@Configuration //설정 클래스
public class TilesConfig {

  @Bean
  public TilesConfigurer tilesConfigurer() {
    final TilesConfigurer configurer = new TilesConfigurer();
    
    configurer.setDefinitions(new String[] {"WEB-INF/tiles/tiles_member.xml"}); //단일 tiles 설정 파일
    //configurer.setDefinitions(new String[] {"WEB-INF/tiles/tiles_member.xml","WEB-INF/tiles/tiles_board.xml"}); //복수 tiles 설정 파일
    
    configurer.setCheckRefresh(true);
    return configurer;
  }
  
  @Bean
  public TilesViewResolver tilesViewResolver() {
    final TilesViewResolver resolver = new TilesViewResolver();
    resolver.setViewClass(TilesView.class);
    return resolver;
  }
  
}


Interceptor

myboot03/src/main/java/com/myboot03/common/interceptor/InterceptorConfig.java

...
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    /* 요청별 interceptor 적용 여부 지정 */
    registry.addInterceptor(new ViewNameInterceptor())
          .addPathPatterns("/*.do") //적용
          .addPathPatterns("/*/*.do") //적용
          .excludePathPatterns("/users/login"); //미적용
  }
  
}

myboot03/src/main/java/com/myboot03/member/controller/MemberControllerImpl. java

  ...
  @Override
  @RequestMapping(value= "/member/listMembers.do", method = RequestMethod.GET)
  public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String viewName = (String)request.getAttribute("viewName");
    
    List membersList = memberService.listMembers();
    ModelAndView mav = new ModelAndView(viewName);
    //ModelAndView mav = new ModelAndView("/member/listMembers");
    mav.addObject("membersList", membersList);
    
    return mav;
  }
  ...


*자바 웹을 다루는 기술

profile
CS 메모장

0개의 댓글