Spring Framework-0

유호준·2021년 3월 12일
0

Spring Framework

목록 보기
1/21

IntelliJ+jdk 1.8+Spring Framework 5.3.3 기준으로합니다

Spring Framework란?

Backend를 개발하기 위한 JavaFramework로 우리나라에서 흔히 쓰이는 Framework입니다. 우리나라의 공공기관 웹 서비스 개발 시 사용을 권장하는 전자정부 프레임워크의 기반 기술로써 사용되고 있습니다.


스프링의 특징

  • 제어 반전(IoC)을 지원하여 컨트롤의 제어권이 사용자가 아니라 Spring에 있어서 필요에 따라 사용자의 코드를 호출합니다.
  • Pojo 방식의 Framework로 기존의 라이브러리등을 지원해 용이하고 객체가 가볍습니다.
  • 의존성 주입(DI)을 지원해 각 계층간 의존성이 존재할 경우 Framework가 연결해줍니다.
  • 관점 지향 프로그래밍(AOP)을 지원하여 모듈에서 공통된 기능을 분리하여 관리할 수 있습니다.
  • 영속성과 관련된 다양한 서비스를 지원합니다.
    - EX) MyBatis, JPA

Spring Framework 프로젝트 생성


Maven을 선택 후, 자신이 사용할 JDK를 정합니다.

프로젝트의 이름을 정하고 Finish 합니다.


Spring Framework 프로젝트 설정

pom.xml 수정

pom.xml을 수정합니다. 원하는 라이브러리를 MavenRepository에서 찾아서 dependencies사이에 추가한 후에 Maven을 이용하여 적용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ac.kr.smu</groupId>
    <artifactId>SpringTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>SpringTest</name>

    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.3.3</org.springframework-version>
        <org.slf4j-version>1.7.29</org.slf4j-version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
            <scope>provided</scope>
        </dependency>

        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
            <scope>test</scope>
        </dependency>
      
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>

        <!-- Servlet -->
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
   
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- Test -->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
            <!--Java 설정을 하기 때문에 web.xml이 없어도 오류가 나오지 않게 설정-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

라이브러리를 하나하나 뭐에 쓰는지는 여기서 알려드리진 않지만, 어떤 이유에서 이 라이브러리를 쓰는 지 알아야합니다.

필요한 폴더 생성


resources 폴더, webapp과 그 하위 폴더들을 모두 생성해줍니다.

resources 폴더와 webapp 하위의 resources 폴더는 쓰임새가 다릅니다. 바깥에 있는 resources 폴더는 log4j.xml , mybatis-config.xml 등이 들어가게 되고, webapp 하위에 있는 resources 폴더는 css, js, img와 같은 정적 리소스들이 들어가게 됩니다.

WebConfig 클래스 작성

web.xml을 자바로 옮긴 코드입니다. xml 설정에서의 root-context.xml, servlet-context.xml을 설정하고 인코딩 필터를 적용합니다.

public class WebConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
    	/*
        	빈을 등록하는 xml에서의 root-context.xml 설정
        */
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RootConfig.class); 
        servletContext.addListener(new ContextLoaderListener(rootContext));
        /*
        	서블렛을 설정하는 xml설정에서의 servlet-context.xml 설정
        */
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(ServletConfig.class);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher",
                new DispatcherServlet(applicationContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
        
        /*
        	인코딩 설정, 해주지 않으면 한글이 깨진다
        */
        FilterRegistration.Dynamic filter = servletContext.addFilter("CHARACTER_ENCODING_FILTER",
                CharacterEncodingFilter.class);
        filter.setInitParameter("encoding", "UTF-8");
        filter.setInitParameter("forceEncoding", "true");
        filter.addMappingForUrlPatterns(null, false, "/*"); // /경로로 들어오는 모든 요청에 필터를 적용
    }
}

ServletConfig 클래스 작성

서블렛 관련 설정을 하는 xml설정에서의 servlet-context.xml을 Java 설정으로 옮긴 코드입니다.

@EnableWebMvc // WebMvc관련 자동 설정
@Configuration // 설정관련 클래스라는 Annotation
public class ServletConfig implements WebMvcConfigurer {
    /*
    	뷰 관련 설정
    */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        WebMvcConfigurer.super.configureViewResolvers(registry);
        registry.jsp("/WEB-INF/views/",".jsp");
    }
    /*
    	정적 리소스 관련 설정
    */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        WebMvcConfigurer.super.addResourceHandlers(registry);
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
}

Servlet이란???

클라이언트의 요청을 처리하고 결과를 반환하는 역할을 수행하는 기술, 이것과 Tomcat(Sevlet Contatiner)을 사용하여 통신을 하여 RequestResponse를 한다.

RootConfig 클래스 작성

Bean을 등록하는 xml설정에서의 root-context.xml을 Java 설정으로 옮긴 코드입니다. 프로젝트 시작 단계에서는 비어있는 상태입니다.

@Configuration
public class RootConfig {
}

Bean이란?

아래의 규칙을 지키는 클래스이며, 이를 root-context.xml(여기서는 RootConfig.class)에 등록하여 클래스의 생명주기의 제어를 Spring에 넘깁니다.

  • 클래스는 인자(Argument)가 없는 기본 생성자(Default constructor)를 갖는다
  • 클래스의 멤버 변수는 프로퍼티(Properties)라고 하며 private 접근 제한자를 가져야 한다.
  • 클래스의 프로퍼티들은 Getter/Setter를 통해 접근할 수 있어야 한다
    Getter의 이름은 get{프로퍼티 이름} 이며, Setter의 이름은 set{프로퍼티 이름}이다.
  • Getter/setter의 접근 제한자는 public이어야 한다.
  • 프로퍼티의 타입이 Boolean인 경우 is로 시작할 수 있다
  • Getter의 경우 파라미터가 존재하지않아야 하며, setter의 경우 하나 이상의 파라미터가 존재한다
  • Read Only인 경우 Setter는 없을 수 있다.
  • Serializable 인터페이스를 구현한다.
  • 자바빈 클래스는 패키징 되어야 한다. (Package)

log4j.xml 작성

로그를 남기는 log4j 관련 설정을 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p: %c - %m%n" />
        </layout>
    </appender>

    <logger name="org.springframework.core">
        <level value="info" />
    </logger>

    <logger name="org.springframework.beans">
        <level value="info" />
    </logger>

    <logger name="org.springframework.context">
        <level value="info" />
    </logger>

    <logger name="org.springframework.web">
        <level value="info" />
    </logger>

    <!-- Root Logger -->
    <root>
        <priority value="info" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

Tomcat 설정

Tomcat이 설치되어 있어야합니다.
Tomcat 공식 홈페이지 : http://tomcat.apache.org/


Add Configuration을 클릭 후 +버튼을 눌러 Tomcat ServerLocal로 추가합니다.


Configure 버튼을 누르고 Tomcat Home의 경로가 Tomcat이 설치되어 있는 폴더로 되어있는지 확인합니다.


HTTP 포트를 확인합니다.


Deployment탭에서 +버튼을 누른 뒤, Artifacts를 선택합니다. 그 후 원하는 옵션을 고릅니다.

  • war : war파일 하나로 배포
  • war exploded : war의 압축을 해제하여 배포

그 후, Application context의 경로를 /로 변경합니다.

Application context는 요청이 들어오는 경로입니다.


테스트

설정이 잘되었는지 테스트를 해봅니다.

모르는 것이 나와도 테스트이므로 그냥 따라해보면 됩니다.

Controller 추가


contoller 패키지를 만들고 그 안에 TestController를 생성합니다.

@Controller
@RequestMapping("/")
public class TestContoller {
    @GetMapping
    public String getTest(){
    	return "test";
    }
}

View 추가


views폴더 안에 test.jsp를 생성합니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Test</title>
</head>
<body>
    <h1>스프링 테스트</h1>
</body>
</html>

@ComponetScan 등록

ServletConfig 클래스에 @ComponetScan을 추가합니다.

@EnableWebMvc
@Configuration
@ComponentScan("ac.kr.smu.controller")
public class ServletConfig implements WebMvcConfigurer {...}

@ComponentScan이란?

basedPackages경로 내에 있는 @Component, @Controller, @Service 등의 클래스를 찾아 Bean으로 등록하는 Annotaion입니다.

실행

Shift+F10을 눌러 실행합니다.

0개의 댓글