클라우드 융합 Full-stack 웹 개발자 양성과정/Spring

Spring - 개발환경구성

thesunset 2022. 12. 20. 09:05

0. Spring Framework

 

JSP, Servlet보다 더 향상된 백엔드 구축 Tool(도구)

스프링을 이용하면 체계적인 웹사이트 구조를 구축 가능

단, 무수히 많은 규칙을 지켜야만 가능 (강제적 성향이 짙음)

 

보통 메뉴얼에 개발룰이 정해져 있음

 

1) Spring의 종류 

- Spring Legacy : 우리가 배울 내용, 근본

- Spring Boot : 설정부분을 줄인 것


1. 개발환경 구성

1) 

툴 : 이클립스, STS(이클립스 개조 버전 Spring을 위한), VSCode

 

주의 *** 한글, 공백, 특수문자 절대 XX

 

https://mvnrepository.com/

=> GSON 다운 받았던 곳 ! 앞으로도 자주 방문할 사이트이므로 즐찾 해놓기 


MAVEN : 라이브러리 정보들을 통합하여 관리하는 프레임워크

https://maven.apache.org/

 

Maven – Welcome to Apache Maven

Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. If you

maven.apache.org

use탭에 download > 

 

conf > settings.xml 파일에서 

<localRepository>태그를 복사 한 후 우리가 만든 repository폴더의 경로를 복사해 복사하기

더보기

Maven 이란?

자바용 프로젝트 관리 도구로, Project Object Model (POM) XML 문서를 통해 해당 프로젝트의 버전 정보 및 라이브러리 정보들을 통합하여 관리하는 프레임워크이다. 일반적으로 프로젝트는 개발자가 필요한 라이브러리를 직접 찾아서 다운로드 및 추가해야 하지만 Maven 을 사용하면 pom.xml 문서에 내가 사용하고자 하는 라이브러리를 등록하여 자동으로 프로젝트에 추가되게 하여 라이브러리 관리 및 버전관리의 편리성을 제공해준다

 

2) DB설정

관리자 계정에서 계정 생성 후 

슬랙에서 table Script 다운받아  스크립트 실행하기 

 

.metadata, Severs폴더는 절대 공유하지 말기 *****

 

3)워크스페이스 셋팅

만들었던 워크스페이스로 열기 

 

(1) Show view 설정

왼 : Spring Explorer, Pacage Explorer(sever삭제 체크박스체크하기), Navigator

왼 하단 : Severs(VW~삭제, 체크박스 체크하기)

가운데 하단 : Console, Progress, Problems

 

(2) shortcuts설정

Customize Perspectvice > Shortcuts

필요한 것 : General(Folder), Java(Class, Interface, Package), Spring(Spring been configuration, String Legacy Project),

Web(JSP File), XML(XML File)

(3) Preferences

(이전과 동일) 

encoding 치고 UTP-8 시리즈 4개

spelling 치고 UTP-8로

JSON Files UTP-8

 

(4) 서버변경

Server - Runtime Environment - 원래 있던 서버 remove

그리고 아파치 톰캣 서버 create new local server

 

(5) 자동완성 변경

code Template - code - catch block body

 

(6) Maven 

apach-maven > conf > settings.xml 

아까 변경한 파일로 변경

 

(7)Team

lognored Resources > AddPattern > */target/* 추가 >  Apply > Apply And close

 

progress바를 유의해서 봐야 함 

 

(8) 서버 셋팅(이클립스와 동일)

서버 포트번호 바꾸기 (안쓰는걸로)

 

3) Spring 셋팅

(1) 프로젝트 생성

New > Spring Legacy Project > 'SpringProject'라고 만들기 

Spting MVC Project > next > 패키지를 3번째 레벨까지 나눔 (동일한 이름의 클래스를 같은 영역에 두지 않으려고)

=> 대형프로젝트일 수도 있으므로

=> ex) com.kh.xxx

=> contextPath가 됨 "com.kh.spring" > finish

내가 도메인으로 적은 내용이 contextPath가 됨

* mybatis와 비교

java == src

resources  == resources 

webapp == Webcontent(views)

 

(2) Maven

Maven이 우리가 사용할 라이브러리를 관리 해줌

 

예를들어 jQuery를 사용하기 위해서 선행작업이 있음

1> jquery 라이브러리 파일을 직접 다운로드 받은 후 경로지정(오프라인 방식) 
- .js파일을 다운로드받아 저장한 후 저장된 파일의 경로를 지정한다. 

2> CDN(Content Delivery Network)을 통한 연결(온라인 방식) 
- 라이브러리를 제공하는 사이트의 url을 제시해서 파일 경로를 지정하는 방식

 

이 역할을 하는 것이 Maven의 역할

 

프로젝트 우클릭

  • 프로퍼티스 - 자바 빌드 패스 버전 확인 프로젝트
  • Project facet 자바버전 1.8로
  • 우측 Runtimes탭. 서버 체크 후 Apply
  • 자바 빌드패스로 가서 JRE System Library 버전 맞는지 다시 확인
  • Deployment Assembly 가서 Maven Dependencies 있는지 확인
  • Apply and close
  • pom.xml : 어떤 라이브러리가 필요한지 알려주는 작업
    • 사용하고자 하는 Library 추가
    • <dependencies> 의 <dependency>안에 추가

1.6 => 1.8로 바꾸기
5.3.22로 바꾸기 > 자동으로 바꿔줌

(3) pom.xml

 

* pom.xml구조
project{프로젝트의 정보 + properties + [repositories(지금당장은 안보임, 필요할 때 추가)] + dependencies build

 

① 프로젝트에 대한 정보 
groupId : 2번째 레벨까지의 패키지 구조 
artifactdId : 3번째 레벨의 패키지명(즉, 프로그램명)
packaging : 배포할 때 압축형식 war (jar는 그냥 프로그램, web이라서 war)

<groupId>com.kh</groupId>
<artifactId>spring</artifactId>
<name>SpringProject</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>

② properties : 이 문서에서 사용할 환경설정 내용들을 담은 변수 (태그명이 변수가 된다)
${변수명}으로 해당값을 불러올 수 있다.

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>5.3.22</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

③ repositories : 기본저장소에서 다운받지 못하는 경우 직접 다운받고자하는 사설 저장소를 등록 

ex) ojdbc6의 경우 더이상 Maven저장소가 아닌 사설 저장소에 저장되어있다. 따라서 사설 저장소를 등록해야한다. 

* 사설 저장소 추가하는 방법

<repositories>
    <repository>
        <id>Datanucleus</id>
        <url>http://www.datanucleus.org/downloads/maven2/</url>
    </repository>

</repositories>

④ dependencies : 프로젝트에서 사용할 라이브러리의 정보들을 담는 곳 (내가 다운 받고자하는 라이브러리들)

- 기본 

<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>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</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>

- 추가적으로 필요한 라이브러리들 세팅

[1]. DB관련(오라클, 마이바티스) 라이브러리들

[1_1]. ojdbc6 라이브러리

: 정보를 알려면 제공하고 있는 웹사이트에 방문해 알아봐야 함 / 이런 정보들을 잘 모아둔 곳이 있음

https://mvnrepository.com/

<dependency>
    <groupId>oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
</dependency>

[1_2] Spring에서 jdbc기능을 사용하기 위한 라이브러리

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

1.2
바뀔 때마다 수정하지 않아도 되도록

[1_3] 순수 MyBatis

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>

순수 MyBatis

[1_4] Spring에서 MyBatis를 이용하기 위한 라이브러리 

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

Spring에서 MyBatis를 이용하기 위한 라이브러리

[1_5] ConnectionPool을 이용하기 위한 라이브러리

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

ConnectionPool을 이용하기 위한 라이브러리

----이부분 수정

파란색=아이디, url 넣기

(4) servlet-context.xml

* 사용자가 어떤 url로 요청을 하던지 이 문서가 읽혀짐

HanderMapping을 통해서 어떤 url로 어떤 controller를 구동시킬 건지 알아내야 함

<xml방식>

① 요청할 때마다 실행될 Controller클래스들을 bean으로 등록

<beans:bean class="com.kh.spring.member.controller.LoginController" id="loginController" />
<beans:bean class="com.kh.spring.member.controller.LogoutController" id="logoutController" />

② 어떤 url로 요청 시 어떤 Cotroller를 구동시킬 건지 매핑시키는 HandlerMapping과 관련된 클래스를 빈으로 등록해야함

<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHanderMapping">
    <bean:property name="mappings">
        <beans:props>
            <beans:prop key="login.me">loginController</beans:prop>
            <beans:prop key="logout.me">logoutController</beans:prop>
        </beans:props>
    </bean:property>
</beans:bean>

=> 장점 : xml 문서 내에서 한 눈에 볼 수 있어서 관리의 편의성이 높음
=> 단점 : bean개수가 많아지면 관리가 어려움

<어노테이션방식>

=> conponent-scan에서 지정한 감시할 패키지명 하위의 모든 클래스들을 스캔해서 
@Controller와 같이 MVC어노테이션이 붙은 클래스를 자동으로 bean으로 등록해주는 방식

단, 내가 직접만든 클래스가 아닐 경우 컴파일이 끝난 .class파일이 배포되어
수정이 불가능하기때문에 코드 상으로 어노테이션을 붙일 수 없다. 
이 경우에는 xml파일로 설정하여 등록해주어야 한다.

 @Controller와 같이 어노테이션을 활성화해주는 설정

<annotation-driven />

* 주소 자동완성 도구 등록
- 매번 / WEB-INF/views/~~ .jsp 를 적기 귀찮으니 자동완성해준다
- ViewResolver라는 도구를 등록(Spring이 등록)
class : 패키지 경로를 포함한 view resolver의 풀 클래스명
prefix : 접두사  / suffix: 접미사

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

* base-package에서 설정된 패키지와 그 이하 패키지를 감시하여

등록 가능한 도구 (@Component)를 모두 찾아서 자동 등록하는 설정

<context:component-scan base-package="com.kh.spring" />

(5) root-context.xml

* root-context.xml
서버 구동과 동시에 web.xml 파일을 거쳐서 바로 로딩되는 문서 == preloading
=> 서버 구동과 동시에 바로 셋팅(bean등록)해야하는 내용등을 작성
주로 DB정보, 트랜잭션처리, 내외부모듈연결 등등..

① DB연결 설정 3단계

 1단계. DB연결을 위한 도구를 설정 

 <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
    <!-- 어떤 DB에 접속할 건지 정보 작성 -->
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="spring"/>
    <property name="password" value="spring"/>
 </bean>
더보기

객체가 필요할 떄마다 내부적으로 실행되는 코드 

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("spring");
dataSource.setPassword("spring");

2단계. Mybatis Spring에서 제공하는 SQL명령어 실행을 위한 도구 등록  

 <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
    <!-- MyBatis설정파일의 위치를 설정(src/main/resources)하여 설정값들을 가져와야 함  -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!-- 어떤 DB에 연결할 건지 연결을 위한 도구 참조 설정 -->
    <property name="dataSource" ref="dataSource"/>

3단계. SQL구문 실행을 위한 템플릿을 제공하는 도구 등록

<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
  <!-- SQL명령어 실행을 위한 도구에 대한 참조를 설정 -->
  <constructor-arg ref="sqlSessionFactory" />
</bean>

* 참고 

property : setter주입
constructor-arg : 생성자 주입

 

서버켜지면 바로 web.xml이 가장 먼저 읽힘 

 

(6) web.xml

- 서버 구동과 동시에 곧바로 읽어낼 문서인 root-context.xml(최상위 설정파일)의 경로를 등록한 부분 

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring/root-context.xml
    /WEB-INF/spring/spring-security.xml
    </param-value>
</context-param>

- DispatcherServlet이 구동될 떄 sevlet-context.xml 파일을 읽겠다. 

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

-  /로 시작하는 모든 요청이 들어올 경우 appServlet에게 보내겠다.

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

 

*필터 
모든 요청 처리 전 공통적으로 필요로 하는 기능들을 
클라이언트의 요청을 Cotroller가 받기 전에 먼저 가로채서 수행할 수 있도록 함
배포서술자(web.xml)에 작성하여 해당 작성내용이 먼저 수행되도록 한다.

* 스프링에서 제공해주는 인코딩 필터를 등록
- org.springframework.web.filter.CharacterEncodingFilter
- 필터 등록 시 filter 태그와 filter-mapping태그를 함께 써야 한다.
-***꼭*** filter-name 태그로 filter명을 지정해야함

 <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 옵션1. 인코딩방식을 UTF-8로 하겠다. -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <!-- 옵션2. 혹시나 충돌 시 강제 인코딩 방식도 UTF-8로 지정 -->
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
 </filter>
 <!-- 위에서 지정한 encodingFilter를 모든 패턴에 적용 -->
 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>