2019년 5월 29일 수요일

Spring 3.X 프로젝트 설정하기 (xml 방식)

Spring 버전 3의 프로젝트 설정방법에 대해 알아보기로 한다. 버전 3 이후론 Annotation을 사용해 코드 내에서 대부분의 설정을 할 수 있지만 이번 포스팅에선 xml 설정 방식을 따르기로 한다. IDE는 Eclipse 기준이고 Spring 3.X, Maven, Mybatis를 쓴다고 가정하였다.

당연히 Spring Boot를 쓰거나 프로젝트 템플릿을 내려받아 쓰는게 편할 것이다. 그렇지만 편해지기 이전에 어떻게 프로젝트 설정을 하고, 설정된 프로젝트는 어떻게 켜지는지 알 필요가 있다고 생각한다. Spring관 관련이 적지만 아래의 링크가 도움이 되었다. 아래 링크는 Spring 프레임워크 없이 쌩 Java-웹 표준 사양만 가지고 웹 프로젝트를 동작시키는 것에 대해 잘 설명해주고 있다.
https://www.in28minutes.com/first-java-web-application-with-jsp-and-servlets-in-25-steps

프로젝트를 만들어보자.


1. File > New > Maven Project

- Use default Workspace location
- maven-archetype-webapp
- Group Id: 네이밍 스키마를 적용한 고유 도메인 이름. 예: org.apache.maven, org.apache.commons
- Artifact Id: 프로젝트 이름, jar 또는 war 파일의 이름이 된다.
# Group Id와 Artifact Id는 특수문자를 사용하지 않고 가급적 소문자로 작성한다. 예: maven, commons-math


2. Java 버전, Facet 설정 [Optional]

- Properties > Java Build Path > Libraries
- Properties > Java Compiler
# pom.xml에서 지정해도 괜찮다. (maven-compiler-plugin)

- 프로젝트 경로 > .settings > org.eclipse.wst.common.project.facet.core.xml
 <installed facet="java"/>, <installed facet="jst.web"/> (Dynamic Web Module -> 3.1) 버전 설정.
- File > Restart
- Properties > Project Facets > 표시되는 버전이 xml에 지정한 것과 일치하는지 확인.


3. web.xml - 스키마 버전 세팅 [Optional]

# 버전이 높을수록 사용할 수 있는 태그의 표현 범위는 늘어나겠지만 안해줘도 크게 상관은 없는듯.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <display-name>project name</display-name>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>


4. Maven Install & edit pom.xml

- Run As > Maven install
- dependency와 build 항목에 필요한 설정을 해준다. (web에 일반적으로 쓰이는 pom.xml을 찾아 참고하면 된다.)
# dependency : spring-context, spring-webmvc, ...
# build : maven-eclipse-plugin, maven-compiler-plugin, maven-war-plugin
- Spring Tools > Add Spring Project Nature : 'Spring Elements'를 프로젝트에 추가해준다.
- Maven > Update Project : pom.xml 내용을 프로젝트에 적용해준다.


5. web.xml, servlet-context.xml 설정

- web.xml에 FrontController 역할을 하는 org.springframework.web.servlet.DispatcherServlet을 등록해준다.
# DispatcherServlet은 보통 하나만 등록하지만 하나의 프로젝트 내부에서 성격이 다른 여러 개의 서비스를 서빙해야 하는 경우 여러 개를 등록할 수 있다.
# DispatcherServlet의 contextConfigLocation 파라미터에 서블릿(스프링) 관련 context 경로를 잡아준다.
- /WEB-INF/config/spring/*-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/config/spring/*-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

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

- /WEB-INF/config/spring/servlet-context.xml을 생성한다. 파일 형식은 Spring Bean Configuration File. 네임스페이스 beans, context, mvc 체크.
- 생성된 servlet-context.xml에 component-scan을 위한 base package를 지정해 준다.
- 애플리케이션 내에서 @Controller, @Component 등 프레임워크에서 제공되는 annotation을 이용하는 것이 일반적이므로 <mvc:annotation-driven />을 선언한다.
- view가 있는 프로젝트라면 view resolver를 설정해준다.
- web.xml에서 encoding filter를 설정해준다. 로그 출력을 위한 log filter, 크로스 도메인간 요청 허용을 위한 cors filter도 필요하면 등록시켜준다.

<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


6. applicationContext.xml 설정

- applicationContext.xml을 생성한다. 형식은 Spring Bean configuration File. 네임스페이스 aop, beans, p, tx 체크.
- web.xml에서 contextConfigLocation 파라미터의 값이 applicationContext.xml을 가리키도록 한다.
- web.xml에서 listener로 ContextLoaderListener를 선언한다.


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

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

- applicationContext.xml에 필요한 bean을 등록해준다. ContextLoaderListener가 applicationContext.xml에 선언된 bean을 파싱하고 singleton으로 로드시키는 역할을 하나보다. Application context와 Servlet context가 있고, 사용자는 이 둘에 대한 life cycle을 Spring Framework에 위임하게 되는 셈.

더 적으려다가 아래 링크를 참고하는게 나을 것 같다. :(
https://handcoding.tistory.com/10?category=621283

2019년 5월 15일 수요일

Python 가상 환경 사용하기 (venv)

Python 3.3 이후 버전부터는 venv 모듈을 이용해 가상 환경을 생성한다. (아래 버전에서는 virtualenv 패키지를 이용하면 된다.) venv 모듈을 통해 특정 프로젝트가 포함된 디렉터리를 Global 환경과 격리시킬 수 있고, 독립적으로 설치된 Python 패키지 집합을 운영할 수 있게 된다.

python -m venv my-env # my-env는 가상 환경 이름이다.
call my-env\Scripts\activate # activate.bat를 호출함으로써 가상 환경이 활성화 된다.
...
(my-env) pip install -r requirements.txt

왜 필요한가?

Python으로 작성된 여러 개의 프로젝트를 운영하는 경우 프로젝트 상황에 따라 같은 모듈이더라도 참조 버전이 갈리는 경우가 발생한다. 혼자서 하는 작업이라면 버전이 높은 쪽을 기준으로 소스 코드를 수정하면 되겠지만 여럿이서 하는 작업이라면 곤란해진다.

이런 문제점의 대안으로 Python은 가상 환경(Virtual environment)이라는 개념을 제공하는데, 프로젝트 별로 전용의 Environment를 설정할 수 있게 해줌으로써 버전 충돌로 인한 문제점을 해결해주고 있다. 특히 참조하는 모듈의 버전 뿐만 아니라 Python 인터프리터 버전도 설정할 수 있기 때문에 여러모로 편리하다고 할 수 있다.

https://dojang.io/mod/page/view.php?id=2470

2019년 5월 2일 목요일

국제화(I18N)과 현지화(L10N)

국제화 (Internationalization): 텍스트의 글로벌한 입출력 처리에 관한 작업. 다양한 나라의 언어 표현 방법을 모두 수용할 수 있도록 만들어주는 것을 의미한다. (=다국어 처리 / Unicode)

현지화 (Localization): 애플리케이션을 특정 Locale에 적합하게 만드는 작업.
 * Locale: 시간대, 시간 및 날짜 표기 형식, 숫자 표기 형식, 통화 기호 등.

국제화는 줄여서 I18N(Internationalization은 I로 시작해서 N으로 끝나는 18자리 단어.)
현지화는 줄여서 L10N(마찬가지로 Localization은 L로 시작해서 N으로 끝나는 10자리 단어.)

국제화는 주로 언어적인 내용과 관련이 있지만 현지화는 지역의 관습이라든가 정렬의 순서, 미적 감각 등 보다 섬세한 측면에서 문화적인 내용을 포함한다.

https://ko.wikipedia.org/wiki/%EA%B5%AD%EC%A0%9C%ED%99%94%EC%99%80_%EC%A7%80%EC%97%AD%ED%99%94