Spring Framework 부터는 라이브러리를 xml파일에 명시하고


이를 토대로 Maven이라는 툴이 자동으로 다운로드 해서 관리 해줄 것이다.


먼저 해당 파일의 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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.kh</groupId>
    <artifactId>tsp</artifactId>
    <name>testSpringProject</name>
    <packaging>war</packaging>
    <version>1.0.0-BUILD-SNAPSHOT</version>
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.0.8.RELEASE</org.springframework-version>
        <org.aspectj-version>1.8.13</org.aspectj-version>
        <org.slf4j-version>1.7.25</org.slf4j-version>
    </properties>
    <dependencies>
        <!-- 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>

        <!-- AspectJ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </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>

        <!-- @Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>

        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </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>

        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>

        <!---------------------------------------- 필요한 추가 라이브러리는 여기 밑에다 등록하면 됨---------------------------------------->

       
        <!---------------------------------------- 필요한 추가 라이브러리는 여기 밑에다 등록하면 됨---------------------------------------->

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</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>
        </plugins>
    </build>
</project>








이 파일은 Legacy Project를 생성하면 자동생성 된다.


주목해서 볼 부분은


    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.0.8.RELEASE</org.springframework-version>
        <org.aspectj-version>1.8.13</org.aspectj-version>
        <org.slf4j-version>1.7.25</org.slf4j-version>
    </properties>



Properties의 기본 버전 설정들과


    <dependencies>
        <!-- Spring -->
        <dependency>


dependencies안에서 시작하는 dependency 태그들이다.


dependency 태그들이 우리가 원하는 라이브러리를 명시하는 부분이고


Maven 툴은 이 파일을 읽어 명시한 dependency 태그를 토대로 다운로드 및 업데이트를 진행한다.






이 dependency 태그들은 MVNrepository 라는 페이지에서 복사해서 붙여넣기만 하면 된다.


https://mvnrepository.com/


위 사이트로 들어가 맨 위 검색창에 원하는 라이브러리를 검색하고





ojdbc6을 예로 든다.


원하는 라이브러리를 클릭





원하는 버전을 클릭, 원래는 수십개씩 나열되어 있다.


선택 기준은 Usages, 사용율이 높은 쪽을 선택하는걸 추천한다.


버전이 높다고 무조건 좋은건 아니다.


다른 라이브러리와 충돌이 나는 경우도 많기 때문에...


버전을 클릭하면 다음 화면이 나온다.




이 화면에서 Maven 탭을 누르면 다음과 같이 dependency 태그를 준다.


이 태그를 복사해서 pom.xml에 복사하고 저장하면 Maven 업데이트가 시작된다.





본 블로그에서 사용할 라이브러리들은 다음과 같이 추가하였다.


테스트 당시 충돌은 없었고 몇번의 다운로드 오류로


repository 폴더의 라이브러리들을 몇번 다 지웠다가 다시 다운로드 했다.


충돌이 나거나 다운로드를 잘못 했다는 기준은


Problems 탭에 빨간색 글씨로 오류가 발견되거나


해당 프로젝트를 톰캣에 올리고 시작하면


서버가 다 켜지기도 전에 오류 발생 메세지를 띄운다.


오류 발생 시 그냥 톰캣 오류라고 뜨기 때문에 오류를 찾기 힘들다.


그러므로 편하게 라이브러리 전부 지우고 다시 설치하고 반복하는게 제일 빠르다.




라이브러리가 많아지면 프로젝트가 무거워지고 톰캣 구동시간이 길어질 수 있다.








해당 블로그에서 사용 할 dependency 태그들은 다음과 같다.


        <!-- jdbc 라이브러리 추가 -->
        <dependency>
            <groupId>com.jslsolucoes</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.1.0</version>
        </dependency>

        <!-- 마이바티스 라이브러리 추가 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!-- spring-jdbc 추가 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

        <!-- 마이바티스 스프링 모듈 추가 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- dbcp 라이브러리 추가 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- 스프링 시큐리티 모듈 추가 -->
        <!-- core, web, config 가 필요하다. -->
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>

        <!-- AOP관련 라이브러리 추가 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
       
        <!-- jackson 추가 -->
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
       
        <!-- Json lib ext 추가 -->
        <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib-ext-spring -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib-ext-spring</artifactId>
            <version>1.0.2</version>
        </dependency>






다음의 포스트부터는 이 라이브러리들이 정상적으로 받아져서


톰캣 실행이 잘 된다는 가정하에 포스트함




사용한 버전들은 version 태그에 잘 써있음












context.xml 파일들로 다양한 설정(서블릿 같은 기능을 하는 문구)들을 관리하게 되는데


한 context 파일을 사용하게 되면 설정이 너무 길어지므로


분류를 두어 나누는 것을 추천한다.


이 xml 파일들을 여러개 만들어 관리를 하지만


이 파일들을 읽어오라고 따로 명시를 해주어야 한다.


이에 대한 설정은 web.xml 이라는 파일에서 진행한다.





다음 예시는 root context를 webapp 바깥의 resources로 옮기고


WEB-INF 폴더 아래의 spring 폴더를 config로 이름을 바꾸고


servlet-context파일을 config로 옮긴 뒤 이름을 action-servlet으로 바꾼다.


위의 수정 내역을 web.xml 파일에 등록


먼저 context-param의 내용을 바꾼다.


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:root-context.xml
        </param-value>
    </context-param>



다음으로는 Servlet 정보, servlet context 정보가 담겨있는


<servlet>태그, <servlet-mapping> 태그를 수정



    <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/action-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
       
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>




이와 같이 servlet-class를 통해서 Dispatcher Servlet을 사용한다고 명시하고


param name과 value를 통해 경로를 입력한다


load-on-startup는 로딩 순서이므로 그냥 적으면 되고


servlet-mapping을 통해서 맵핑 주소를 설정한다.


실행 테스트를 할 때 localhost:포트/키워드를 주소창에 입력했을때


자동으로 맨 뒤에 슬래시가 붙는데 localhost:포트/키워드/


슬래시의 맵핑 주소가 설정 된 곳으로 연결되게 된다.





또 하나의 예제로 member를 통해 맵핑 설정을 이해해보자.


    <servlet>
        <servlet-name>member</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/member-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>member</servlet-name>
        <url-pattern>*.me</url-pattern>
    </servlet-mapping>



*.me를 통해서 url 이 .me로 끝나는 연결은


/WEB-INF/config/member-servlet.xml 경로의 설정을 읽어서 연결을 한다.





보너스로 이와 같은 방법으로 Dispatcher Servlet을 이용하여 Encoding 타입을 바꾸는 방법은 다음과 같다.


    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>





Servlet에서는 필터 클래스를 생성하여 들어오는 모든 요청(/*)의 인코딩 타입을 UTF-8로 설정했지만


Spring에선 위와같이 명시하면 끝난다.










+ 추가 - context 파일에 들어가는 내용


Spring Framework는 객체를 생성 시 자동으로 new 객체()를 해주도록 설정 할 수 있다.


이 설정은 context.xml 파일들에서 설정하고


이러한 객체(예전에 VO 폴더에 만든 객체들)들을 bean 이라고 한다.


해당하는 서블릿으로 연결되면 bean들을 하나하나 생성 할 필요 없이 바로바로 사용 할 수 있게 설정하는 xml이다.








+ 추가 - context.xml 파일이 어떻게 맵핑 주소를 명시한 java 파일을 찾는가


context.xml의 내용을 보면


<context:component-scan base-package="패키지 명" />


context라는 태그가 존재하고 base-package라는 속성이 등록되어 있다.


base-package에 등록된 경로를 따라서 하위에 존재하는 java 파일들을 전부 스캔하여


@RequestMapping("맵핑 주소") 라는 어노테이션을 사용한 메소드들을 찾는다.


톰캣이 이를 가지고 있다가 맵핑 주소에 요청이 들어오면 해당하는 메소드에 연결해주는 방식이다.


bean 객체를 자동으로 잡아주는 방법도 있고 수동으로 등록을 해야 할 때가 있다.


자동으로 잡아주는 방식은 @Controller, @Service, @Repository와 같은 어노테이션으로 자동으로 잡히게 된다.


자세한 설명은 Autowired를 사용할때 게시합니다.









Window - Preferences에서


ignored Resources를 검색하면 Team 관련 설정이 나온다.


사진과 같이 */target/* 패턴을 추가하면


Spring 프로젝트 컴파일 시 생성되는 target 파일들이 git 업로드에 잡히지 않는다.


하지만 설정을 해도 잘 안먹힐때가 많다....ㅜㅜ










스프링 프레임워크를 적용한 프로젝트를 진행한다면


여러가지 프로젝트를 사용 할 수 있고


각각의 프로젝트의 라이브러리 버전이 상이 할 수 있다.


그러므로 Workspace마다 repository(라이브러리 경로)가 겹친다면 버전에 충돌이 생기고


실행시 오류가 발생할 수 있다.


그러므로 workspace마다 경로를 다르게 설정하는걸 추천한다.


설정은 다음과 같이 진행한다.





1. 관련 파일 다운로드, 아래 사이트를 방문


https://maven.apache.org/download.cgi


메이븐 홈페이지에서 Maven 툴을 새로 받자.






Files에서 Binary zip 파일을 받고 원하는 경로에 압축을 해제하자.


해제하면 다음과 같이 여러개를 만들어서 쓰면 된다.


스크린샷의 경우 default 경로를 아예 apache-maven-3.6.0로 잡고


새 프로젝트에서는 apache-maven-3.6.0-final 경로를 사용한다.





폴더를 들어가서






사진과 같이 repository 폴더를 생성하자, 이쪽에 라이브러리를 저장하도록 설정할 것이다.


여기서 conf 폴더로 들어가 설정을 바꾼다.






여기서 settings 파일을 열어서


(윈도우 기본 텍스트 에디터로 안 바뀔 수 있으므로 notepad++ 라는 프로그램 사용을 권장)


<localRepository>D:\Dev\apache-maven-3.6.0\repository</localRepository>


위의 태그를 아무대나 localRepository라는 태그 + 아까 추가한 repository 경로를 입력하고 저장하자.






이제 이클립스를 통해 settings 파일을 잡아주면 라이브러리 경로가 해당 경로로 바뀌게 된다.


상단 메뉴바의 Window - Preferences를 열고




settings를 검색하면 Maven의 하위 메뉴에 라이브러리 임의 경로를 설정할 수 있다.


user Setting을 잡아주면


Local Repository가 아까 xml 파일에 입력한 경로로 바뀔것이다.


기본경로는 예전에 소개한 .m2 / repository로 되어있을 것이다.












먼저 Spring Legacy Project를 생성하면 위와 같은 구조로 프로젝트가 생성이 된다.


주목할 부분만 펼쳐서 스크린샷을 찍었다.


스크린샷에서 빨간색 네모 박스는 직접 추가한 폴더






1. 크게 프로젝트는 src 폴더에 코드를 작성하게 된다.


작성한 프로젝트를 Tomcat에 올려서 실행하면 컴파일 되어


target이란 폴더에 저장된다.





2. Class 파일은 src - main - java 아래의


패키지 구조(프로젝트 생성 시 설정한 com.회사명.프로젝트명)로 이루어져 있다.


가장 하단 - MVC 패턴인 분류 - Controller

                                                                                        Model - Dao / Exception / Service / Vo


위의 구조로 생성하게 된다.







3. 프로젝트의 설정들이 저장될 폴더



객체 연결(root-context.xml)이나 로그(log4j.xml) 또는 DB와 관련된 설정 파일들 (/src/main/resources)


뷰에 대한 설정 파일들 js, css, 기본 이미지 폴더 등(/src/main/webapp/resources)


페이지, 프로젝트 연결 설정과 같은 xml 파일들 (/src/main/webapp/WEB-INF/config)


/src/main/webapp/WEB-INF/web.xml는 Tomcat 서버의 기본 설정들이 저장된다.(기본 페이지 경로와 같은 설정들)


pom.xml는 Maven이라는 툴을 이용한 라이브러리 관리 설정들






4. 라이브러리 관리 부연 설명


먼저 가장 중요한 Maven을 통해 Library 관리인데


프로젝트 내 pom.xml 이라는 파일을 열어보면 라이브러리,


버전 또한 이곳에 명시하여 자동으로 다운로드 해준다.


예를들어 pom.xml 파일을 열고 하단의 탭에서 pom.xml 탭을 선택하면


해당 파일의 설정 코드로 볼 수 있다. 이곳에서



dependency라는 태그로 라이브러리를 관리한다.


버전 또한 원하는 버전으로 위와같이 쓰인다.


원하는 라이브러리를 추가 할 때는 예전에 소개한 https://mvnrepository.com/ 이 사이트에서 검색해서


<dependency> 태그를 복사해서 적당한 위치에 붙여넣기 하고 파일을 저장하면 자동으로 다운받아진다.


하지만 이곳에서 다운로드 중 오류가 많이 발생하므로 주의해야한다.


문제가 생기면 톰캣이 안켜지거나 Problem View(탭)에 경고 메세지가 뜰 것이다.


이럴 땐 https://qdgbjsdnb.tistory.com/230?category=733876 설치 방법에서 설명한 방법으로


Eclipse를 종료하고





위의 경로에 있는 오류가 발생한 폴더(다운받은 라이브러리)를 삭제하고 이클립스를 다시 키고


(자동으로 다시 라이브러리를 다운 받지만 업데이트를 하는걸 추천)


프로젝트 우클릭 - Maven - Update Project를 누르고 ( 단축키 : 알트 + F5 )


나오는 창에서 바로 OK를 누르면 다운로드가 진행된다.


다시 다운받은 파일이 또 오류가 날 수 있다. 그러면 다시 반복하면 된다.










이클립스의 workspace를 새로 설정


window - Preferences의 설정에서 인코딩 설정


General - Workspace


General - Editors - Text Editors - Spelling


JSON - JSON Files


Web - CSS Files


Web - HTML Files


Web - JSP Files


XML - XML Files


위의 7가지를 전부 UTF-8로 인코딩을 설정한다.





JSP 파일을 생성할 때 구지 필요없는 문구들이 생성되는데


이는 Web - JSP Files - Editor - Templates에서


New JSP File(html)을 눌러서 우측의 Edit 버튼을 누르면


나오는 파일 내용을


<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="${encoding}">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
${cursor}
</body>
</html>



이와 같이 바꿔준다. 이제부터 새로 만들 때 마다 jquery까지 포함되서 나옴







다음으로는 View, 인터페이스 조정


모든 인터페이스를 닫고 상단 메뉴바의 Window - Show View에서


Project Explorer, Navigator, Servers, Console, Progress, Problems를 추가


Spring이 잘 설치됫는지 알 필요가 있기 때문에 이 중 Progress, Problems 두가지를 통해서 확인할 수 있다.








다음으로는 Project Explorer에서 우클릭 - New 했을 때 나오는 파일 생성 메뉴들을 조정


상단 메뉴바의 Window - Perspective - Customize Perspective


나오는 창에서 Shortcut Categories 중


General 항목의 File, Folder


Java 항목의 Class, Interface, Package


Web 항목의 CSS File, Dynamic Web Project, Filter, HTML, JSP File, Servlet


XML 항목의 XML File


그리고 나중에 Spring을 전부 설치하고 Spring 항목이 생기면 Spring Legacy Project를 눌러 메뉴들을 수정하자.







이제 Spring Framework의 본격적인 설치


1. 상단 메뉴바의 Help - Eclipse Marketplace 에서 Find에서 'sts'라고 검색




Spring Tools 3 Add-On 항목의 우측 아래의 Install 버튼을 클릭하면 설치가 시작된다.


위의 사진은 이미 설치가 되어있어 Installed라고 나온다.


설치가 시작되면 아까 추가한 인터페이스 중 Progress를 눌러보면 진행 상황이 나온다.


중간에 설치 파일 동의, Legacy 허용? 여부 등 다양한 창이 나오는데


모든 항목을 체크하고 승인하고 진행하자.


Eclipse가 재시작이 되면 설치가 완료된 것이고


설치가 완료됫으면 아까 추가한 인터페이스에서 Problems를 확인해보자.





다음과 같이 Warnings 한 두개만 있는게 정상이다.


빨간색으로 오류가 나온다면 설치가 잘못된 것이다.


해결법은 다음과 같이 있다.







Spring 오류 해결법 첫번째



이클립스 종료 - Spring Maven에서 관리하는 라이브러리들을 전부 삭제하고


다시 다운받기, 다운받는데 오류가 생각보다 많이 발생한다.


(반복)








Spring 오류 해결법 두번째






Eclipse Marketplace에서 sts, Spring Tools를 다시 설치한다.


우측 아래의 Installed 를 누르면 삭제 항목이 나오고


삭제 한 후 다시 install을 하면 된다.






크게 이 두가지 방법으로 Problems의 빨간 오류를 다 잡으면 된다.


간혹 오류를 다 잡고 Spring 프로젝트를 생성하고


Tomcat에 올려 실행할 때 오류가 발생 할 수 있다.


그럴 경우에도 똑같은 해결방법을 해보자.





이제 프로젝트를 생성해보자.


Server 탭에 Tomcat을 올리고


Navigator 우클릭 - New - Spring Legacy Project






프로젝트 명을 설정하고 Template에서 MVC를 선택하고 Next> 를 선택






여기서 빈 부분은 패키지 구조를 넣으면 된다.


보통은 3단계 구조로


com.회사명.프로젝트명 으로 작성한다.


이 후 Finish를 눌러 생성하면 된다.


생성하면 지금 생성한 프로젝트에 필요한 라이브러리를 다운로드하기 시작하고


Progress에 표시된다.


Problems 탭을 자주 확인하여 문제를 확인해야 한다.






프로젝트가 생성되고


Progress에 다운로드가 모두 완료되고


Problems에 문제가 모두 해결되면(Warning은 무시해도 된다.)


프로젝트 - src - main-  webapp - WEB-INF - views - home.jsp 파일에서


상단에 인코딩 처리가 안되어 있기 때문에


<%@ page session="false" pageEncoding="UTF-8" %>


이와 같이 인코딩을 추가한다.










다음으로 jstl 라이브러리 추가, 기본 프로젝트에서 쓰기 때문에 따로 추가해주어야 한다.




다음과 같이 WEB-INF 아래에 lib 폴더를 만들어 jstl 라이브러리를 넣어주자.


jstl 라이브러리(jar 파일)는 https://qdgbjsdnb.tistory.com/217에서 받을 수 있다.







이제 기본적으로 실행하기 위한 준비는 끝났다.


톰캣에 올려서 실행하여 접속해보자.





만약 톰캣 실행 시 오류가 발생하면 아까와 같이 Spring 해결법을 이용해서 해결해보자.





톰캣 주소는 아까 com.회사명.프로젝트명에서


localhost:'설정한 포트번호'/'프로젝트명'  으로 테스트 하면 된다.


톰캣 실행시 오류가 없고 페이지를 열때 문제가 없다면 Spring이 무사히 설치 된 것이다.






추가로 여러가지 버전 정보를 바꾸는 방법


프로젝트에 pom.xml이란 파일이 있는데 이 파일을 열어 pom.xml 탭을 누르면


xml 태그 소스들을 볼 수 있다.


기본 버전 정보는 다음과 같은 형식으로 되어 있을것이다.




버전은 임의로 바꾼 값들을 넣었다.


그리고 properties 아래에 dependency 태그들은 추가 될 라이브러리들의 버전을 관리해준다.









먼저 MyBatis jar파일을 라이브러리에 추가한다.


메이븐이라는 사이트를 이용


mvnrepository.com


메이븐은 나중에 나오지만 라이브러리들의 버전을 관리해주고 프로젝트 관리를 해주는 시스템? 이라고 한다.


위 사이트로 들어가 상단 검색창에 mybatis를 검색하자.








리스트에 나온 MyBatis를 클릭하고







해당 화면이 나오는데 여태껏 나온 버전별로 쭉 나온다.


버전별로 이용률도 한눈에 확인 할 수 있다.(Usages)


버전의 경우 X1.X2.X3 과 같은 형태로 관리된다.


X1의 경우는 하위 버전과 호환이 안되고 매우 크게 변화가 있는 경우이고


X2의 경우는 하위 버전과 호환이 되지만 일부 오류가 있을 수 있다.


X3의 경우는 보통 버그 픽스나 간단한 수정 등 작은 변경시 기록된다.




신버전은 항상 최신이여서 좋은것은 아니다.


신버전일 수록 사람들이 많이 사용해보지 않았고 버그가 발견되지 않아서 안정성 문제가 발생 할 수 있다는 점을 알아두자.



이 블로그에서 사용할 MyBatis 버전은 3.4.1이다. 3.4.1버전의 숫자를 눌러 다음 페이지로 넘어가자








jar 파일을 다음과 같이 lib 폴더에 추가하면 된다.















곧 Spring Framework에 대한 내용을 게시할 예정인데


Framework가 무엇인지 알아보자.


출처 - 네이버 어학사전




네이버 선생님의 어학사전에 따르면 뼈대, 틀, 체계와 같은 의미로 쓰인다.


어떤 단어가 기술 이름과 같은 곳에 쓰일때에는 절대 연관성이 없는 단어를 끌어다 쓰지 않는다.


그러므로 프로그래밍에서 Framework 또한 기존의 의미에서 벗어나지 않는다는 얘기다.


프로그래밍에서 쓰이는 Framework의 뜻은


개발자가 따르는 가이드나


개발자가 할 수 있는 개발의 범위를 지정하여 제한하거나


개발자가 사용할 수 있는 다양한 도구 플러그인을 말한다.





장단점이 중요한데


장점으로는


1. 개발 시간의 단축


2. 정형화 되어 일정 수준의 품질을 기대 할 수 있다.


3. 유지 보수가 쉽다.




단점으로는


1. 너무 의존하게 되면 개발자들의 능력이 떨어진다 (이 부분은 사전적인 장단점으로 사람마다 다르다고 생각한다.)


2. 어렵기 때문에 습득하는 시간이 오래걸린다





Framework의 종류로는 4가지가 있다.



영속성 Framework 

 데이터 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들을 라이브러리화 하여 구현

Mybatis

Hibernate

자바 Framework

 Java EE를 통한 웹 어플리케이션 개발에 초점, 필요한 요소들을 모듈화

 Spring Framework

전자정부표준 - Spring

Struts

화면 구현 Framework

 Front-End를 보다 쉽게 구현할 수 있게 틀을 제공

 Bootstrap

Foundation

MDL

기능 및 지원 Framework

 특정 기능, 업무 수행에 도움을 줄 수 있는 기능을 제공

 Log4j

JUnit 5

ANT















http://tomcat.apache.org/taglibs/standard/



위의 톰캣 사이트에서 Jar 파일 받아서 lib에 추가하면 된다.


버젼은 1.2를 사용하고


이후에 나온 버전은 여러가지 기능들이 분리되어 파일이 여러개가 된다고 한다..?



jstl-1.2.jar


같은 파일이므로 이것을 받아도 된다.








Action태그, EL 태그란 Session이나 Attribute Parameter와 같은 형식으로


받은 데이터나 직접 변수를 선언하여 사용하거나


함수들을 매우 간편하게 사용 할 수 있는 기능이다.







먼저 서블릿에서 데이터를 받았을 때 사용했던 방식을 살펴보자


JSP 페이지 상단에


<%@page import="com.jsp.member.model.vo.Member"%>



Member mem = (Member)session.getAttribute("member")


%>


바디 부분


<body>

<p><%=mem%></p>

</body>



위와 같은 형식으로


객체를 불러오고, 변수 선언, 값 불러오기, 형 변환을 거처서 사용했다.





하지만 JSTL을 사용하면 많이 줄어든다.


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


위에 tag 라이브러리 c(core)를 사용한다고 선언하고


바로 바디 부분에서


<p>${ member }</p>


위와 같이 사용할 수 있다.


몰론 생략된 구문이 몇개가 있다.


Scope 연산자라고 불러온 값이 Session 값인지 parameter 값인지 등 구분하는 키워드를 앞에 붙여주는 것이다.


만약 Session과 parameter에 같은 이름으로 값을 전달했다면 어느 데이터를 가져오는지 확실치 않기 때문..


불러오는 우선순위가 있어 상관없지만 많은 값들을 기억하기 힘드니 명시하는것을 추천


${ sessionScope.member }


다음 글에서 자세히 설명한다.

















+ Recent posts