-
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가지로 추려지는데
- 경로가 잘못된 경우
- 경로가 지워진 경우
- 경로가 중복 등록된 경우
나와 같은 경우는 3번이였는데 위에서 나는 Add Framework를 수행할 때 스프링 5.0.7을 추가했으나 pom.xml에서 4.3.18 버전을 선택했기 때문에 스프링에서 에러를 뱉어 낸 것이다. 앞으로는 주의하도록 하자.
'코드로 배우는 스프링 웹 프로젝트_intellij' 카테고리의 다른 글
Chapter 4. MyBatis 스프링 연동 (0) 2021.04.15 Chapter 3. 스프링과 Oracle Database 연동 (0) 2021.04.14 Chapter 2. 스프링의 특징과 의존성 주입 (0) 2021.04.13 코드로 배우는 스프링 웹 프로젝트 1) 개발환경 (0) 2021.04.12