ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 1. 스프링 개발 환경 구축
    코드로 배우는 스프링 웹 프로젝트_intellij 2021. 4. 12. 15:31

    Intellij에서 SDK를 지정했다면 프로젝트를 생성하는 방법은 2가지가 있는데 

    1. Maven 프로젝트를 만들고 Spring을 곁들이는 방법

    2. Spring 프로젝트를 만들고 Maven을 적용하는 방법 

     

    * 2번 방법은 디렉터리 국조가 달라지기에 1번 방법이 더 편하다 생각하여 1번을 채택하였습니다,

     

    GroupId와 ArtifactId


    1. GroupId

    - GroupId는 프로젝트르 모든 프로젝트 사이에서 식별하게 해주는 것으로서 GroupId에는 네이밍 스키마를 적용하도록 한다.(package 명명규칙을 따르고 내가 컨트롤하는 도메인이어야 한다.)

    ex) ora.apache.maven

     

    2. ArtifactId

    - ArtifactId는 버전 정보를 생략한 jar 파일의 이름

    - 이름은 원하는 것으로 해도 되나 소문자만을 사용해야하고 특수문자는 사용하면 안된다.

     

     

    Project name과 Project location 설정


    New>Project를 사용한후 Maven을 선택하면 프로젝트의 이름과 위치를 정할수 있게 된다. 이 과정을 다 수행하게 되면

    위와 같은 창이 나오게 된다. Maven 프로젝트가 만들어진 것인데

    Maven프로젝트에 Spring 적용


    이제 생성된 Maven 프로젝트 구조에 Spring을 적용하는 과정을 수행할 것이다. 프로젝트명에 우측 마우스를 갖다 된 후 Add Framework Supprot를 눌러 프로젝트를 추가해주도록 하자.

    누르게 되면 FrameWork 리스트 들이 나오게 되는데 우리는 Spring을 적용할 것이므로 Spring MVC를 체크하고 ok를 누른다.

    이 과정을 지나게되면 프로젝트 구조에 몇 개의 폴더가 추가된 것을 볼 수 있다,

     

      Eclipse Intellij
    bean 설정 root-context.xml applicationContext.xml
    내부 웹 관련 처리 servlet-context.xml dispatcher-servlet.xml
    tomcat web.xml web.xml

    이 내용에 대해서는 차차 알아보도록 하자. Maven 프로젝트에 Spring을 곁들였지만 여기서 한가지 더 해줘야 하는 것이 있는데 바로 라이브러리를 추가해 주는 것이다.

    File>Project Structure>Artifacts 

    WEB-INF 밑에 lib 폴더를 만들고 Available Elements에 있는 2가지의 관련 라이브러리를 더블 클릭으로 추가한다. 위 과정을 수행하게 되면 아래와 같은 구조를 만들게 된다.

     

    Tomcat 설정


    Intellij 우측 상단에 보면 Add Configuration이라는 버튼이 있는데 이 실행 버튼을 활성화시켜야 합니다. 아직은 서버를 활성화시켜주지 않았기 때문에 비활성화 되어있는 것이여서 Server를 지정하겠습니다.

    마지막 사진에서 Tocat Server>Local을 선택한 후 Tomcat을 설치한 경로로 지정을 해준다 이때 Tomcat이 project를 바라보록 설정해주어야 하는데 

    위와 같이 Deployment에 +버튼이나 Server에 Fix버튼을 활용해 바라봐주도록 설정할 수 있다.(쉬운 과정이니 금방 할 수 있을 것이다.)

     

    이렇게 된다면 Tomcat Server가 정상적으로 구동을 하게 된 것이다.

    또한 deployment 탭에서 Application context를 /로 바꾸어주면 된다.

     

     

    Lombok 설치


    롬복은 getter/setter, toString(), 생성자 등을 자동으로 생성하여 개발자가 반복적으로 작업하는 코드를 제거하므로 생산성과 가독성 향상에 도움을 주는 라이브러리이다.

    setting>plugin>lombok 검색 후 설치

     

     

    MySQL 연결 테스트와 Oracle 연결 테스트 그리고 Junit


    MySQL


    MySQL과 Oracle을 설치하고 JDBC 연결이 정상적으로 이루어지는데 테스트를 해야합니다. 이 과정을 진행하기 전에

    (Mysql 명령어)

    CREATE DATABASE spring_tuto default CHARACTER SET UTF8

    ㅇ. JUnit

    @Test

    - 테스트해야 하는 내용을 메소드 안에 작성하고 메소드 위에 @Test 어노테인션을 추가하면 JUnit은 해당 메소드를 테스트용 코드로 간주하고 테스트를 진행할 수 있게 함.

    @Before

    - 모든 테스트 작업에 앞서 준비되어야 하는 내용을 작성해서 메소드에 추가하는 어노테이션 @Test가 실행 되기 전에 실행

    @After

    - 테스트 작업이 끝난 후 자동으로 실행도디는 메소드에 추가되는 어노테이션

    @org.junit.Assert.assertxxx

    - 테스트 중에 발생하는 값을 확인(assert)하는 용도. 테스트 중간에 특정 값이나 상태를 예상하고 체크하는 용도로 사용

    pom.xml


    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>wimes</groupId>
        <artifactId>SpringTutorial</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.48</version>
            </dependency>
    
            <!-- Test -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
    </project>

    JDBC 연결 코드 작성


    jdbc 연결 코드는 src/main/java 밑에 org.wimes.web.MySQLConnection으로 작성한다.

    package org.wimes.web;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class MySQLConnectionTest {
        public static void main(String[] args) {
            Connection con = null;
    
            String server = "localhost"; // MySQL 서버 주소
            String database = ""; // MySQL DATABASE 이름
            String user_name = "root"; //  MySQL 서버 아이디
            String password = "1234"; // MySQL 서버 비밀번호
    
            // 1.드라이버 로딩
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                System.err.println(" !! <JDBC 오류> Driver load 오류: " + e.getMessage());
                e.printStackTrace();
            }
    
            // 2.연결
            try {
                con = DriverManager.getConnection("jdbc:mysql://" + server + "/" + database + "?useSSL=false", user_name, password);
                System.out.println("정상적으로 연결되었습니다.");
            } catch(SQLException e) {
                System.err.println("con 오류:" + e.getMessage());
                e.printStackTrace();
            }
    
            // 3.해제
            try {
                if(con != null)
                    con.close();
            } catch (SQLException e) {}
        }
    }

    위의 코드는 src/main에 위치한 jdbc 연결 코드 아래의 코드는 src/test에 있는 jdbc 연결테스트 코드이다.

    package org.wimes.web;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    import org.junit.Test;
    
    public class MySQLConnectionTest {
        private static final String DRIVER =
                //MySQL Driver 5 이하
                "com.mysql.jdbc.Driver";
                //MySQL Driver 6 이상
                //"com.mysql.cj.jdbc.Driver";
        private static final String URL =
                //MySQL 5.6 이하
                //"jdbc:mysql://127.0.0.1:3306/Spring_tuto";
                //MySQL 5.7 이상
                "jdbc:mysql://127.0.0.1:3306/Spring_tuto?useSSL=false&serverTimezone=UTC";
        private static final String USER =
                "root";
        private static final String PW =
                "beyondme";
    
        @Test
        public void testConnection() throws Exception{
            Class.forName(DRIVER);
            try(Connection con = DriverManager.getConnection(URL, USER, PW)){
                System.out.println(con);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
    }

    try-with-resources are not supported at language level '5'에러 문구를 뱉어낼 경우 setting>Build, Executuion, Deployment>java Compiler에서 project bytecode version을 8로 맞추면 됩니다

    *이 에러의 원인은 try-with 구문은 jdk 1,7 버전 이후에 지원되기 때문에 현재 프로젝트의 버전을 1.7 이상으로 바꾸어 주면 해결.

    두 개의 Connection을 테스트 해본 결과가 이렇게 출력된다면 잘 된 것이다.

    (저 빨간색 에러는 새로운 버전으로 하라는 에러이기에 지장이 있는 에러는 아니다.)


    Oracle

    project structure>library 에서 + java를 통해 oracle의 ojdbc.jar를 가져오는 과정이다.

    Apply 버튼을 누르면 정상적으로 추가된 것이다.

     

    pom.xml 파일 설정


    pom.xml 파일에서 프로젝스 설정, 라이브러리 의존성 설정, 빌드 설정을 할 수 있습니다. 기본적인 부분에 대해서만 설정할 것이고 프로젝트를 진행하면서 필요한 라이브러리는 추가해주면 됩니다. 아래의 코드를 <project>와 </project>사이에 입력하면 됩니다.

    <properties>
            <java-version>1.8</java-version>
            <org.springframework-version>4.3.18.RELEASE</org.springframework-version>
            <org.aspectj-version>1.6.10</org.aspectj-version>
            <org.slf4j-version>1.6.6</org.slf4j-version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${org.springframework-version}</version>
                <exclusions>
                    <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>
    
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${org.aspectj-version}</version>
            </dependency>
    
            <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.17</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>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${org.springframework-version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.0</version>
                <scope>provided</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>
            </plugins>
        </build>

     이 것을 입력한 후 Sync를 시켜야한다. 또한 Project Structure>Artifacts에서 추가시키면 

    이렇게 만들면 된다.

     

     

    Log4J


    System.out.println()을 사용하지 않고 log를 쓰게 되는데 그때 필요한 것이 Log4j이다. Log4j는 에러 코드도 모아 보기 쉽기 때문이다. 이것을 사용하기 위해서는 log4j.xml파일을 설정해야하는데 그 내용은 아래와 같다. src>java>resources에 위치시킨다.

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

     

    DataBase 연동 확인


    오라클 데이터베이스가 정상적으로 작동이 가능한지 체크하기 위해서 테스트 코드를 작성해야한다. src/test/java의 위치에 JdbcTest.class를 생성해본다.

     

    package org.wimes.web;
    import lombok.extern.log4j.Log4j;
    import org.junit.Test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    import static org.junit.Assert.fail;
    
    @Log4j
    public class JdbcTest {
        static {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void connection() {
            try(Connection conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:XE", "system", "root")) {
                log.info(conn);
            } catch (Exception e) {
                fail(e.getMessage());
            }
        }
    }
    

      위의 코드는 JdbcTest이고 이것을 실행시키면 

    SQLDeveloper 접속 오류 - IO 오류 : The Network Adapter could not establish the connection 이러한 에러가 발생할 수 있는데 이러한 경우는 제어판>모든 제어판 항목>서비스>OracleXETNSListener를 시작으로 바꾸면 됨.

    정상 수행하는 것을 알 수 있다.

     

    Spring MVC 테스트


    MVC2 방식의 Controller가 정상적으로 수행하는지 확인하기 위해서 관련 파일들을 수정해야한다.

    -web.xml에서 <url-pattern>*.form</url-pattern>를 <url pattern>/</urlpattern>이렇게 변경

    - src/main/java/com.whitepaek/controller 패키지에 HelloController.class를 만든다.

    package com.whitepaek.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("/home/*")
    public class HomeController {
    
        @GetMapping("test")
        public @ResponseBody String homeTest() {
            return "Spring + Maven";
        }
    }

    - dispatcher-servlet.xml에 아래의 코드를 추가한다.

     

    <context:component-scan base-package="com.whitepaek.controller"/>

     

    이후 http://localhost:8080/home/test에 들어가 정상적으로 컨트롤러가 작동하는지 체크해보자.

     

     

     


    에러일지


     org.apache.catalina.core.StandardContext.startInternal이라는 에러 코드가 발생시 WEB-INF를 못찾는 것이 문제였다. 이런 경우 3가지로 추려지는데

    1. 경로가 잘못된 경우
    2. 경로가 지워진 경우
    3. 경로가 중복 등록된 경우 

    나와 같은 경우는 3번이였는데 위에서 나는 Add Framework를 수행할 때 스프링 5.0.7을 추가했으나 pom.xml에서 4.3.18 버전을 선택했기 때문에 스프링에서 에러를 뱉어 낸 것이다. 앞으로는 주의하도록 하자.

     

Designed by Tistory.