본문 바로가기

수업 정리

63~65일차 수업 정리(Spring MVC Project 외 정리)

**XML

    => Hyper Text Markup Language : Tag 를 브라우저가 해석해서 랜더링

    => eXtensible Markup Language : 확장 마크업 언어

    => XML은 태그의 의미를 DTD에 설정한 곳이나 개발자가 해석

    => HTML이 구조적이지 못하여 데이터를 표현하는데 한계가 있어 만들어낸 데이터 표현 포멧

        - 프로젝트 설정이나 OpenAPI 에 많이 사용

        - 프로젝트 설정 파일로 사용되는 경우 우리가 해석할 수 없고 해석을 대신해주는 DTD를 상단에 선언해주어야 함

 

**Spring MVC Project 에서 사용되는 XML

  1) 이름이 고정된 파일

    => Server.xml : Tomcat의 설정파일

    => pom.xml : Maven의 설정 파일

    => web.xml : Web Application의 설정 파일

 

    => applicationContext.xml : Spring MVC 전체에서 사용되는 설정 파일

    => dispatcher-servlet.xml : URL 패턴에 해당하는 요청에만 사용하는 설정 파일

 

    => mybatis의 환경설정파일과 매퍼 파일 - 대신 인터페이스를 사용할 수 있음

    => hibernate의 경우는 매퍼 파일

 

**개발환경

    => Operating System : Windows 10

    => Database : MySQL

    => Programming Language : Java 1.8

    => IDE : Eclipse

    => WAS : Apache Tomcat 9.0

    => Build Tool : Maven

    => Unit Test : JUnit

    => SCM(Software Configuration Management - 형상관리) : Git hub

    => Framework : Spring 5.0, Hibernate

 

**pom.xml 파일의 주요태그

1. properties

    => 아래에서 많이 사용할 문자열을 태그로 만들어 두는 것

 

2. repository

    => 기본적으로 Maven 중앙 저장소에서 다운로드 받는 데 다른 곳에서 다운받고자 할때 다운 받을 위치를 설정

 

3. dependencies

    => 사용할 외부 라이브러리

 

**Spring MVC Project 구조

1. web.xml

<!-- 애플리케이션이 시작될 때나 종료될때 또는 세션이 만들어질 때 세션이 소멸될 때 등의 
이벤트가 발생하면 호출되는 객체의 클래스를 설정하는 태그가 listener
WEB-LIF 디렉토리에 applicationContext.xml 파일이 있어야 함 -->
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- applicationContext.xml 파일의 경로를 수정하는 설정 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- URL 패턴에 따라서 사용할 스프링 설정 파일을 지정하는 태그 -->
<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>
	
<servlet-mapping>
	<servlet-name>appServlet</servlet-name>
	<!-- /는 .jsp를 제외한 모든 요청에 응답 -->
	<url-pattern>/</url-pattern>
</servlet-mapping>

 

2. root-context.xml

    => 모든 곳에서 사용할 bean을 설정하는 파일

    => 데이터베이스 접속 정보를 생성

 

3. servlet-context.xml

    => web.xml파일에 설정한 url 패턴에 해당하는 요청이 왔을 때 사용할 bean을 설정하는 파일

<!-- Spring MVC Project에서 사용하는 50여가지의 어노테이션을 사용할 수 있도록 해주는 설정-->
<annotation-driven />

<!-- 변화가 거의 없는 파일들을 저장해두면 캐싱하여 이용할 수 있도록 해주는 설정 
 기본은 root(webapp, WebContent) 디렉토리의 resources, 캐싱 시간 설정도 가능-->
<resources mapping="/resources/**" location="/resources/" />

<!-- Controller에서 forwarding 하는 View 이름을 넘겨주었을 때 실제 사용할 View를 결정하는 설정 -->
<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>
	
<!-- bean을 자동생성해주는 root 패키지 설정 클래스 생성시 이 패키지 안에 만드는 것을 권장
다른 패키지를 만들었다면 다른 패키지도 추가해주면 됨 -->
<context:component-scan base-package="kr.co.pk" />

 

4. kr.co.pk 패키지에 가면 HomeController가 생성되어 있음

//시작요청이 오면 home으로 포워딩
// : servlet-context 파일의 ViewResolver와 결합해서 실제 출력할 View를 결정
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
	return "home";
}

 

**하나의 서비스 구현 절차

    => 어디에서 요청을 할 것인지, 어떤 요청을 할 것인지 결정

        - 시작하자마자 : /

    => 대부분의 서비스는 2가지 형태

        - 바로 데이터를 요청해서 출력하는 서비스 : 목록보기나 상세보기

       : 요청 -> Controller -> Service -> DAO -> 저장소 -> DAO -> Service -> Controller -> View

        - 입력화면을 이용해서 파라미터를 입력받고 요청하여 출력 : 삽입, 삭제, 로그인, 검색

* 삽입 : 요청-> Controller-> View-> Controller-> Service-> DAO-> 저장소 -> DAO -> Service -> Controller -> View

* 수정 : 요청-> Controller-> Service-> DAO-> 저장소-> DAO -> Service-> Controller-> View-> Controller-> Service

          -> DAO-> 저장소-> DAO-> Service-> Controller-> View

 

**url 패턴을 '/' 나 '/*'를 사용했을 때의 문제점

    => / : .jsp를 제외한 모든 요청을 처리

    => /* : 모든 요청을 처리

    => 확장자가 jsp가 아니면(css, js) Controller가 처리하려 하고, Controller에 처리하는 코드가 없으면 404 에러발생

    => servlet-context.xml 파일에 Controller가 처리하지 않으면 WAS가 처리하도록 하는 설정을 추가 해 주어야 함

 

**집에 있는 PC를 고정된 IP를 갖도록 할 수 있음

    => IP 공유기를 사용할 경우 IP공유기 포트 포워딩을 검색

 

**Oracle과 MySQL의 차이

1. 테이블을 생성할 때 자료형의 차이

    => 오라클은 숫자를 number로 만들지만 MySQL은 int, float으로 생성

    => 오라클은 문자열을 char, varchar2, clob로 표현하지만 MySQL은 char, varchar, text로 표현

    => 오라클은 sequence로 일련번호를 만들지만 MySQL은 auto_increment로 생성

 

2. 조회에서의 차이

    => 오라클은 페이징(나누어서 가져오기)시 인라인뷰를 사용, MySQL은 limit 구문 이용(MySQL이 쉬움)

    => 오라클은 인코딩 설정을 하지 않아도 되지만 MySQL은 반드시 인코딩 설정을 해야 함

 

**Hibernate

    => ORM : Object Relation Mapper - 객체와 데이터베이스 테이블의 데이터를 매핑시키는 프레임워크

        - 최근 등장하는 데이터베이스 연동 프레임워크는 거의 대부분 ORM

 

============================================================================

20.07.08

    => 어제까지 한 프로젝트 : http://github.com/itggangpae/springmvc0708.git 

 

itggangpae/springmvc0708

Contribute to itggangpae/springmvc0708 development by creating an account on GitHub.

github.com

1. 자신의 데이터베이스를 사용하고자 하는 경우

    => root-context.xml 팔일의 DataSource 수정

    => 위의 주석을 해제하면 Oracle이고 그대로 두면 MySQL

 

2. ItemDAO 클래스

    => 하이버네이트 사용 - 그대로, MYBatis 사용 : 메소드 내 주석해제, 하이버네이트 호출구문 주석처리

 

3. ItremServiceImpl 클래스에서 ItemDAO로 작업시

   => xml 파일 - MyBatis, ItemMapper - 인터페이스를 이용하는 것이 됨

 

**File 클래스

    => java.io.File 클래스

    => 인스턴스 생성법, 디렉토리인 경우 내부 파일 목록을 가져오는 방법, 파일의 존재 여부 확인, 파일의 크기나 마지

        막 업데이트 된 날짜를 가져오는 API는 중요

    => 애플리케이션을 만들게 되면 애플리케이션 안에 파일을 저장해서 사용하는 경우가 많은데 없으면 생성하고 있는

        경우에는 서버에서 업데이트 된 날짜와 비교하여 수정하는 작업들을 수행해야 함

 

**파일 다운로드 뷰 생성

    => AbstractView로 부터 상속 받는 View 클래스를 생성

    => renderMergedOutputModel 이라는 메소드를 오버라이딩하여 그 안에 파일명, 파일 크기등을 설정해야 함

    => 다운로드 요청시 생성한 View를 이용하여 출력하도록 설정

 

**Excel 출력

    => apache poi 라이브러리를 이용

    => AbstractXlsView로 부터 상속 받는 클래스를 만들어서 출력

    => WorkBook이 파일이고 파일 안에 WorkSheet가 있고, 안에 Row가 있고, 안에 Cell이 존재

        - 출력은 Cell을 생성하여 출력

    => Excel은 2003이전에는 확장자가 xls, 이후로는 xlsx인데 2개의 포맷이 다름

        - 생성을 할 때 개념은 같은데 클래스 이름의 앞글자가 다름, H, X로 시작

    => 엑셀로 보여주는 요청이 파일 이름이 됨

        - 확장자를 xls나 xlsx로 만드는 것이 좋음

 

**PDF 출력

    => iText API를 이용하여 출력

    => 거의 모든 프로그래밍 언어에서 사용이 가능

    => AbstractPdfView 클래스를 상속받는 클래스를 만들어서 출력

    => 기본적으로 한글 출력이 안됨

        - 한글 폰트를 별도로 설정해야 함

 

**REST(Represenctational State Transfer)

    => 하나의 URI는 하나의 서비스를 대표하게 설계

    => 서버에 접근하는 기기의 종류에 상관없이 동일한 URI로 처리하도록 설계

    => 이전에는 서버가 데이터를 가지고 뷰를 만들어서 클라이언트에 전송하는 구조

        - 서버는 데이터를 전송하여 클라이언트가 자신의 특성에 맞게 데이터를 골라서 출력할 수 있도록 설계

    => 최근에는 Server에서 Client에서 데이터를 넘길 때 JSON 형식을 가장 많이 사용

        - XML: 사람이 보기쉽지만 사이즈가 크고, JSON: 사람이 보기 어렵지만 사이즈가 작고 클라이언트가 쉽게 해석

        - 사람이 직접 설정하는 곳에서는 아직도 XML을 더 많이 사용

 

**Spring에서 json 출력

1. jsp 파일에서 JSONArray나 JSONObject를 출력

 

2. 출력할 뷰를 JacksonView를 이용하여 출력

 

3. Controller에서 ResponseBody를 이용하여 출력

 

4. RestController를 만들어서 String 리턴시 csv가, 그 외 객체 타입이나 List 리턴시 JSON으로 생성하여 출력

    => 데이터 리턴시 Object(Map 같은 객체)를 리턴

        - Array나 List 리턴은 좋지 않음