0. Spring Framework
JSP, Servlet보다 더 향상된 백엔드 구축 Tool(도구)
스프링을 이용하면 체계적인 웹사이트 구조를 구축 가능
단, 무수히 많은 규칙을 지켜야만 가능 (강제적 성향이 짙음)
보통 메뉴얼에 개발룰이 정해져 있음
1) Spring의 종류
- Spring Legacy : 우리가 배울 내용, 근본
- Spring Boot : 설정부분을 줄인 것
1. 개발환경 구성
1)
툴 : 이클립스, STS(이클립스 개조 버전 Spring을 위한), VSCode
주의 *** 한글, 공백, 특수문자 절대 XX
=> GSON 다운 받았던 곳 ! 앞으로도 자주 방문할 사이트이므로 즐찾 해놓기
MAVEN : 라이브러리 정보들을 통합하여 관리하는 프레임워크
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
* 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>안에 추가
(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 라이브러리
: 정보를 알려면 제공하고 있는 웹사이트에 방문해 알아봐야 함 / 이런 정보들을 잘 모아둔 곳이 있음
<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_3] 순수 MyBatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
[1_4] Spring에서 MyBatis를 이용하기 위한 라이브러리
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
[1_5] ConnectionPool을 이용하기 위한 라이브러리
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
----이부분 수정
(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>
'클라우드 융합 Full-stack 웹 개발자 양성과정 > Spring' 카테고리의 다른 글
Spring - 마이페이지(수정), 회원탈퇴, 게시글리스트조회 (0) | 2022.12.23 |
---|---|
Spring - 로그인, 로그아웃, 회원가입 (0) | 2022.12.20 |
MyBatis - 검색, filter기능 (0) | 2022.12.19 |
MyBatis - 환경구성, 로그인, 회원가입기능, 게시글리스트 조회, 게시글 상세조회 (0) | 2022.12.17 |
EL표현언어, JSTL (9) | 2022.12.13 |