본문 바로가기

JAVA/Spring

[Spring] STS, 스프링 플러그인 없이 일반 이클립스 Maven프로젝트로 스프링 프로젝트로 생성하기

그냥 STS깔아서 스프링 레거시 프로젝트를 만들면 되는 것을 왜 이 고생을 사서 하나 싶기도 하지만...이클립스를 여러개 깔기도 싫고 마켓플레이스에 있는 스프링 플러그인 설치가 여간 까탈스러운게 아니기때문에 그냥 이클립스만 쓰고싶을 수도 있을 것이다. 고로 일반 이클립스 메이븐 프로젝트를 스프링 프로젝트로 바꾸는 방법을 알아보겠다.

 

1. 이클립스 실행 >  New  Other...  

 

maven-archetype-webapp, quickstarter를 선택하라는 얘기도 있는데 나는 이렇게 하면 자바 리소스 폴더가 몽땅 사라진채로 생성됐다. 그냥 Simple Project 체크하고 생성해라.

 

2. 다이나믹 웹 모듈 추가

 

막 프로젝트를 생성하면 첫번째 그림처럼 아주 단촐한 프로젝트가 생성된다. 웹 설정이 안돼있는 상태이므로  프로젝트 속성  Project Facets  으로 들어가 다이나믹 웹 모듈을 추가해준다.

 

3. 스프링 수동 설정 시작

 

웹 다이나믹 모듈을 막 추가하면 뷰단에 아무것도 안들어있다. 위와같이 수동으로 폴더 및 파일을 생성하고 pom.xml에 원래 본인이 쓰던 스프링관련 디펜던시를 추가 후 메이븐 업데이트를 한 번 때려준다. 그리고 자바단으로 가서 프로젝트 패키지 밑에 config라는 패키지를 하나 만들고 WebConfig.java라는 빈 클래스 파일을 하나 만들어 둔다.

 

그리고나서 web.xml은 아래와 같이 적어준다. 챗GPT가 알려준 코드이다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <display-name>MySpringMVCApp</display-name>

    <!-- DispatcherServlet 설정 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>본인프로젝트패키지경로.WebConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

 

알다시피 스프링 설정 파일은 3개의 xml로 이루어져 있다. DB를 설정하는 컨텍스트.xml, 그리고 컨트롤러를 설정하는 서블릿.xml, 그리고 이 두개를 불러오는 web.xml. 그러나 이번 프로젝트는 web.xml을 제외하곤 스프링 설정을 모두 클래스 파일로 할 예정이다.

 

<param-value>com.회사이름.프로젝트이름.config.WebConfig</param-value> 이부분에 주의해야 하는데 com.회사이름.프로젝트이름.config.WebConfig.java에 설정 파일을 만들어놨다면 java를 빼고 앞부분만 써준다. 

원래대로라면 <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 이런식으로 서블릿.xml을 넣는 부분이다. 고로 WebConfig.java가 서블릿 설정 클래스파일이라는 얘기이다. 덧붙여 원래는 web.xml에서 root-context.xml도 불러오는 것으로 알고있으나 클래스 파일로 설정할 땐 따로 안넣어도 되는듯하다.

 

4. 서블릿 및 컨트롤러 설정

 

자 web.xml에서 불러오고 있는 서블릿 설정을 하러가자. config 패키지에 webConfig.java가 서블릿.xml의 역할을 할것이다. WebConfig.java 파일은 아래와 같이 작성한다.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.회사이름.프로젝트이름.controller")
public class WebConfig extends WebMvcConfigurerAdapter{

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/"); // 뷰의 경로 설정
        resolver.setSuffix(".jsp"); // 뷰의 확장자 설정
        return resolver;
    }	
	
}

 

 

컨트롤러는 아래와 같이 작성한다.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SampleController {

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

 

 

그리고 뷰단 views폴더 아래 index.jsp를 만들어준다. 톰캣설정 후 프로젝트를 띄워보자. 아래와 같이 인덱스 파일을 잘 띄운다면 컨트롤러 설정 성공!

 

 

5. DB 및 Junit 설정

 

첫번째 사진과 같이 클래스파일을 만든다. 그리고 프로젝스 속성 빌드 패스에서 Junit5를 추가한다. Junit5를 수동으로 붙였기때문에 디펜던시는 spring-test만 붙여준다.

 

눈치챘겠지만 DatabaseConfig.java가 root-context.xml 설정 파일을 대신한다. 위 파일은 아래와 같이 작성한다. 디비 정보는 당연히 본인의 디비정보를 넣어야한다. 고대로 쓰는 바보는 없겠지?

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan("com.회사명.프로젝트명.mapper")
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.mariadb.jdbc.Driver");
        dataSource.setUrl("jdbc:mariadb://localhost:3306/testdb");
        dataSource.setUsername("root");
        dataSource.setPassword("0000");
        return dataSource;
    }
    
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*.xml"));
        return sessionFactory.getObject();
    } 

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

}

 

간단한 매퍼 및 마이바티스를 작성한다. 매퍼 및 마이바티스에 대한 자세한 설명은 생략한다.

public interface SampleMapper {

	String selectNow();
}

 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.회사명.프로젝트명.mapper.SampleMapper">

	<select id="selectNow" resultType="String">
		select now()
	</select>

</mapper>

 

 

작성이 끝났다면 프로젝트 구조가 위와 같아야한다. 이제 마지막으로 마이바티스 Junit 테스트를 하러 가보자.

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;

import com.회사명.프로젝트명.config.DatabaseConfig;

@Import(DatabaseConfig.class)
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = DatabaseConfig.class)
public class SampleMapperTest {

    @Autowired
    private SampleMapper sampleMapper;

    @Test
    @Transactional
    public void testGetAllEntities() {
        System.out.println(sampleMapper.selectNow());
    }
}

 

 

시간이 별 문제없이 찍힌다면 성공!

 

여기까지 만들어놓고 본인은 아래 블로그를 따라 모든 설정 파일을 클래스 파일로 바꿨다. 참고.

https://pugyu.tistory.com/84

 

[spring] 자바 Config 설정하기 vs XML 설정하기

Spring Framework는 설정이 반이라는 말이 있다. 그만큼 초기 설정 방법도 여러 가지고 복잡하기 때문에 이런 말이 나왔을 거라 생각한다. (스프링 부트를 이용해서 간단하게 설정하는 해결하는 방법

pugyu.tistory.com

 

728x90