티스토리 뷰

 

회사 프로젝트 중에 전자정부프레임워크에서 Spring boot로 마이그레이션을 한다고 한다. 아마 설계는 내가 진행하지 않겠지만, 일단 환경 자체는 알아야 할 것 같아서 셋팅을 진행했다.

 

보통 spring boot환경에서는 front는 SPA를 api통신해서 사용하거나 thymleaf를 사용하는데 고객사의 제작비 절감..?으로 인해 기존 jsp를 그대로 가져가게 되었다. 처음보는 환경이라 어떤 설정이 필요한지 진행했다.


Spring Boot에서 JSP 사용

1. Spring boot 프로젝트 generate

https://start.spring.io/

 

평소와 같이 start.spring.io에서 boot를 생성 해주었다. 

jdk17, Maven, war로 설정해주었다. 일단 기본으로 받고 dependency를 추가해주고 싶었기에 spring web만 추가해서 받아주었다. war로 설정한 이유는 딱히 없지만 혹시나 다른 톰캣서버 등에 배포할 때에 유리해보여서 war로 해봤다.

 

 

2. 처음만들면 src/main 안에 webapp이 없다.

jsp 를 위해서 꼭필요한 폴더이다.

 

src>main>webapp > WEB-INF 폴더를 추가시켜 준다.

 

 

3. 매핑을 시켜줘도 jsp는 나오지 않는다.

@Controller
public class BasicController {

    @GetMapping("/test")
    public String test(){

        return "test";
    }

 

 WEB-INF에 views 폴더를 만들어 test.jsp를 작성했다. 당연히 url/test 으로 가도 제대로 작동하지 않는다.

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
		</dependency>

pom.xml

> 해당 dependency를 꼭 추가시켜줘야 작동이 된다.

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.devtools.remote.restart.enabled=true

application.properties 

> view의 prefix와 suffix를 추가시켜준다. 이로써 컨트롤러의 String return 값으로 jsp를 찾을 수 있게 된다.

spring.devtools.remote.restart.enabled=true

추가로 넣어둔 프로퍼티는 톰캣 재기동 없이 jsp가 변경되게 도와준다. Spring Regacy에서는 그냥 되었던거 같은데.. 기억이 안난다.


DB및 Mybatis 연동

이 부분은 꽤 헷갈렸다. (boot는 JPA기반으로만 사용해봄) Spring Regacy에서는 mybatis설정할 때에 xml을 사용했기 때문이다. 찾아보니 boot는 @configuration 태그의 class에서 빈은 생성하는게 일반적이다. mybatis도 class에서 bean 등록해서 사용해야한다.

PostgreSql연결

@Configuration
@EnableTransactionManagement
public class DBConfig {

    @Value("${spring.datasource.driver-class-name}")
    String className;

    @Value("${spring.datasource.url}")
    String dataUrl;

    @Value("${spring.datasource.username}")
    String userName;

    @Value("${spring.datasource.password}")
    String userPw;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(className);
        dataSource.setUrl(dataUrl);
        dataSource.setUsername(userName);
        dataSource.setPassword(userPw);
        return dataSource;
    }

@Bean은 @Configuration 어노테이션이 있는 class에서만 등록된다는 것을 잊지말자. 이렇게 DataSource를 등록시켜 넣으면 예전 xml과 동일하게 작동하게 된다.

 

추가 X(Spring Regacy 예시)

<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- MySQL 버전에 따라 driverClassName의 value값이 달라짐 아래 코드는 Mysql 8기준 -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <!-- MySQL 버전이 6인 경우 아래 코드 반영 -->
    <!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> -->
    <property name="url"
              value="jdbc:mysql://localhost:3306/스키마이름?useSSL=false&amp;serverTimezone=Asia/Seoul">
    </property>
    <property name="username" value="MySQL계정아이디"></property>
    <property name="password" value="MySQL계정비번"></property>
</bean>

단순히 작성 예시일뿐이다. 자세히 보면 Class로도 Datasource를 불러오며 사용하는걸 볼 수 있다. 결국 bean 등록이 중요하다.


mybatis 연결

@Configuration
@EnableTransactionManagement
public class DBConfig {

    @Value("${spring.datasource.driver-class-name}")
    String className;

    @Value("${spring.datasource.url}")
    String dataUrl;

    @Value("${spring.datasource.username}")
    String userName;

    @Value("${spring.datasource.password}")
    String userPw;

    @Bean
    public DataSource dataSource() {
		...
    }
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mybatis/mappers/*.xml"));
        Resource myBatisConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(myBatisConfig);
        
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

 

  • SqlSessionFactoryBean은 Spring이 MyBatis와 통합할 수 있도록 도와주는 팩토리 빈입니다.
  • 이 빈은 MyBatis의 SqlSessionFactory 객체를 생성하고 구성합니다.
  • 생성된 SqlSessionTemplate 객체를 반환합니다.
  • 이 객체는 애플리케이션에서 MyBatis 매퍼와 상호작용하는 데 사용됩니다.

이 설명은 chatgpt가 해준건데.

1. 다시 말해 sqlSessionFactory에 연결 Datasource 설정을 하고 mybatis-config를 연결해준다. 

2. 만든 sqlSessionFactory를 return하고 다음 메서드가  sqlSessionTemplate를 생성할 때 넣는다.

 

이렇게 주입된 sqlSessiontemplate를 우리가 @autowired로 받아서 쓰건 해서 주입된 bean을 불러와 사용하는 것이다.

<?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>

 

 

 

만약 mappers를 클래스에서 설정했다면 xml에서는 mybatis 설정만 잡으면 된다.

 

 

* 참고로 이런 설정도 가능하다. boot에서 자동으로 잡아주는 설정인데

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.devtools.remote.restart.enabled=true

spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=testuser
spring.datasource.password=testUser
spring.datasource.driver-class-name=org.postgresql.Driver

mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=mybatis/mappers/*.xml

 

이렇게 DBConfig 클래스를 동일하게 application.properties에 작성해주고  DBConfig 클래스를 삭제해도 잘 작동한다.

 

  • Spring Boot는 다양한 "starter" 의존성을 제공합니다. 이들은 공통적으로 필요한 의존성과 자동 설정을 포함합니다.
  • 예를 들어, spring-boot-starter-data-jpa, spring-boot-starter-jdbc, spring-boot-starter-mybatis 등을 사용하면 데이터베이스와 관련된 설정이 자동으로 제공됩니다.
  • application.properties 파일에 정의된 설정은 Spring Boot의 자동 설정에서 사용됩니다.
  • spring.datasource.url, spring.datasource.username, spring.datasource.password, spring.datasource.driver-class-name 등의 속성은 Spring Boot가 DataSource를 자동으로 구성하는 데 사용됩니다.
  • mybatis.config-location 및 mybatis.mapper-locations 속성은 MyBatis와 관련된 설정을 자동으로 구성하는 데 사용됩니다.
  • Spring Boot는 자동 구성 클래스(@Configuration 클래스)를 사용하여 빈을 자동으로 생성합니다.
  • 예를 들어, Spring Boot의 MyBatis 자동 구성 클래스는 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration입니다. 이 클래스는 DataSource를 기반으로 SqlSessionFactory, SqlSessionTemplate 등을 자동으로 설정합니다.

이런 특성을 가지고 있다. 참고하면 좋다.

 

따라서 db를 두개 연결하거나, mapper의 path가 2개 이상이거나 할 때 혹은 db의 설정이 간단하지 않을 때에 Config 클래스를 사용하는 것이 좋을 것 같다.

 


JSTL 설정

		<!-- JSTL -->
		<dependency>
			<groupId>jakarta.servlet</groupId>
			<artifactId>jakarta.servlet-api</artifactId>
			<version>6.0.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>jakarta.servlet.jsp.jstl</groupId>
			<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
			<version>3.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.glassfish.web</groupId>
			<artifactId>jakarta.servlet.jsp.jstl</artifactId>
			<version>3.0.1</version>
		</dependency>

 

Spring boot 버전이 3 이상으로 올라가면 dependency 하나로는 안된다고 한다.  위의 3개의 dependency를 추가해준다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함