반응형

스프링 부트 프레임워크에는 내장 웹 서버(톰캣)가 자동으로 설정되어 있습니다. 

그렇기에 우리는 SpringBootApplication을 통해 웹 서버를 작동시킬 수 있습니다.

 

다음은 스프링부트 기반 jar/war의 내장 웹 서버(톰캣)를 이용해서 윈도우 서비스 등록을 사용 방법에 대해서 설명하겠습니다.

 

 winsw 프로그램 다운로드 

 

https://github.com/kohsuke/winsw/releases

http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/2.1.2/

 

위의 링크를 통해 winsw의 최신 버전 exe 파일을 다운 받는다. 

 

 

 winsw 설정

 

winsw.exe 파일과 동일한 폴더 위치에서 다음과 같은 설정  .xml을 만든다 

 

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<service>
    <id>서비스명</id>
    <name>서비스명</name>
    <description>서비스에 대한 설명</description>
    <executable>java</executable>
    <arguments>-jar "xxxx.jar / xxx.war"</arguments>
    <logmode>rotate</logmode>
</service>
cs

 

winsw.exe 와 설정파일.xml 은 동일한 이름으로 변경한다 

 -> 주로 프로젝트 명 혹은 서비스 등록 명으로 바꾸면 된다.

 

xxxx.jar / xxxx.war 의 경우는 자신의 스프링 부트 jar를 입력하면 된다.

 

 

 서비스 등록

 관리자 권한으로 CMD 창을 실행 한다.

  관리자 권한으로 실행하지 않을 시 권한 거부 에러가 발행할 수 있다.

 

위에서 만든 서비스명.exe (winsw.exe) 파일 위치로 이동 한 뒤 아래의 명령어를 친다.

 

서비스명.exe install

에러가 발생하지 않으면 서비스에 내가 등록한 서비스명으로 서비스가 등록된 것을 확인할 수가 있다.

 

반대로 등록한 서비스를 삭제하는 방법으로는 

서비스명.exe uninstall

 

 또한 

 서비스는 등록되었으나 서비스 시작 시 발생하는 에러는 

 동일 폴더 내 log 파일을 확인할 수 있다.

 

 

 

 

관련 내용 출처

 -http://cpsally.blogspot.com/2018/06/spring-boot-as-windows-service.html

 

반응형
반응형

SPRING에서 AOP란 

 

대부분의 시스템이 공통으로 가지는 보안이나, 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 '횡단 관심사(Cross-Concern)'라고 하며, 스프링은 이러한 횡단 관심사를 분리해서 제작하는 것이 가능합니다.

AOP(Aspect Oriented Programming)는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임입니다.

또한 이러한 횡단 관심사의 가장 흔한 예는 보안이나 성능 모니터링과 같은 작업을 들 수 있습니다.

 

- 코드로 배우는 스프링 웹 프로젝트 출처 -

 

이론적으로는 이런 설명인데 이게 과연 소스상에서는 어떤 부분을 어떻게 구성했다 라고 말 할 수 있는 걸까 ?

 

실제 프로젝트를 진행하면서 스프링시큐리티를 이용하여 보안을 설정하였고, logger를 이용하여 로그를 남기는 등의 작업을 하였고, 이것을 나는 AOP를 구현하였다고 생각하고 있었지만......

일단 책에서는 

spring-aop 관련 라이브러리를 pom.xml에 추가하고 @Aspect 어노테이션을 선언한 컴포넌트를 구현한 것을 aop를 사용 하는 것이라 설명하고 있다.

@Before, @After @Around 등을 통해 설정을 한 비즈니스 로직 외 의 부분을 실행 하도록 설정하는 것이다.

 

 

그런데 작성하면서 느낀 점이 AOP에서 하는 기능은 Spring의 인터셉터(Interceptor)와 거의 같은 기능을 수행한다!!!

 

둘의 차이점은 파라미터의 차이!!! 

 

AOP는 JoinPoint 나 ProceedingJoinPoint 등을 활용하여 대상이 되는 메소드의 파라미터를 처리

Interceptor는 HttpServletRequest나  HttpServletResponse를 활용하여 파라미터를 처리

 

 

고로.... AOP의 개념을 알고... AOP를 직접 사용하진 않았지만 그에 걸맞는 기능인 인터셉터를 사용하여 구현한 적인 있다!!!!

 

 

반응형
반응형

1. 인텔리J 설정

  - Settings -> Build, Execution, Deployment -> Compiler 클릭

   - 상세 화면 내 Build project automatically 체크  확인




  - Registry 값 변경 (Search Everywhere로 'Registry' 검색, 혹은 Ctrl+Alt+Shift+/ )

 compiler.automake.allow.when.app.running 레지스트리 값을 체크 V




2. Spring-boot-devtools 의존성 추가

- Maven

   pom.xml 파일 내 추가

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>

- Gradle 

   build.gradle 파일 내 추가

compile('org.springframework.boot:spring-boot-devtools')



3. 프로퍼티 설정 값 추가 (application.properties or application.yml) 

spring.devtools.livereload.enabled=true
spring.devtools.restart.enabled=true
spring.thymeleaf.cache=false




참고 : http://lhb0517.tistory.com/entry/SpringIntelliJ-SpringBoot-HotSwap-with-IntelliJ

반응형
반응형
의문 무엇을 바꿔야 변경을 할 수 있을까? data 설정이 들어간 'datasource-context.xml' 을 보자. 

이렇게 설정 되어 있다.
찾아 보니 driver가 net.sf.log4jdbc.DriverSpy 이거는 log4jdbc를 이용하여 sql문을 로그로 남기기 위해 사용하는 드라이브
내가 고민한 부분은 url 부분이다. mysql은 어떻게 변경해야될까 하는데 

아래 처럼 url을 mysql 처럼 변경을 했음에도 계속 찾을 수 없다고 나온다. 
왜 그럴까 생각하니 
mysql 라이브러리르 pom.xml에 설정을 안한 것이다. 

#jdbc.driver=net.sf.log4jdbc.DriverSpy
#jdbc.url=jdbc:log4jdbc:oracle:thin:@211.108.61.201:1533:R3PROD
#jdbc.username=r3usr
#jdbc.password=bsgr3usr

#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=net.sf.log4jdbc.DriverSpy
#//jdbc.driver=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc.url=jdbc:log4jdbc:mysql://localhost:3306/woowon
jdbc.username=sang
jdbc.password=mariasang

위처럼 설정하고 
pom.xml에 
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>
     설정하니 정상 작동한다. 


반응형
반응형
ㅁ 타임리프를 스프링에 맞춰보자
  1. xml 설정 (예제에서는 webconfig.java를 만들어서 설정을 bean으로 다 추가 했다)
        아래는 xml에 추가해야 될 부분
<!-- SpringResourceTemplateResolver automatically integrates with Spring's own --><!-- resource resolution infrastructure, which is highly recommended. --><bean id="templateResolver"
class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/WEB-INF/templates/" />
<property name="suffix" value=".html" />
<!-- HTML is the default value, added here for the sake of clarity. -->
<property name="templateMode" value="HTML" />
<!-- Template cache is true by default. Set to false if you want -->
<!-- templates to be automatically updated when modified. -->
<property name="cacheable" value="true" /></bean>
<!-- SpringTemplateEngine automatically applies SpringStandardDialect and --><!-- enables Spring's own MessageSource message resolution mechanisms. --><bean id="templateEngine"
class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
<!-- Enabling the SpringEL compiler with Spring 4.2.4 or newer can speed up -->
<!-- execution in most scenarios, but might be incompatible with specific -->
<!-- cases when expressions in one template are reused across different data -->
<!-- ypes, so this flag is "false" by default for safer backwards -->
<!-- compatibility. -->

<property name="enableSpringELCompiler" value="true" /></bean>


반응형
반응형

스프링 프레임워크를 이용하여 다국어 메세지 처리를 설정할 수 있다.

다국어 처리를 통해 동일 페이지를 언어별로 만들지 않고, 한페이지 내 에서 언어코드를 이용하여 사용자에게 설정된 언어로 웹 페이지를 제공 할 수 있게 된다.


프로젝트를 진행하면서 다국어 관련 자료를 많이 찾게 되었고, 적용방법 또한 여러 방법이 있었다.

일반적인 방법은


1. 다국어 메세지 설정 파일 작성

2. 메세지 프로퍼티 파일 작성

3. 인터럽트를 통해 Language Code 변경 혹은 설정

4. java 혹은 jsp 파일 내에서 메세지 key 값으로 불러오기



하지만

내가 적용 하고 싶은 방법은 인터럽트를 통해서 Language Code를 설정하는 것이 아닌

로그인 성공하게 되면 로그인 한 사용자DB 정보 중 Language Code 값을 통해 웹 사이트의 Language Code를 설정하고자 한다.



첫째로 다국어 처리 관련 설정을 할 'message=context.xml' 을 작성한다



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages/message"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="ko"/>
</bean>

</beans>


messageSource를 사용하기 위해 bean에 추가하고, basename 으로 'classpath:messages/message' 를 설정 기본 인코딩 값을 UTF-8로 설정

  - basename의 설명은 아래 그림을 참조하자

 - 그림에서 보면 classpath는 resources로 설정되어 있고 그 하위에 messages 폴더가 존재, 그 하위에 message_xx.properties 파일들로 구성되어있는 곳을 basename으로 설정한 것이다.

위 messages, message의 색으로 구분 할 수가 있다.

<!-- ###################   MessageSource   ################### -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/i18n/ui</value>
<value>classpath:/i18n/message</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>


위의 경우처럼 ui, message 두개의 프로퍼티로 나눠서 구분 할 수도 있다.



message_xx.properties 파일 내에는 각 언어에 맞게 key = value 형식으로 값을 채워 넣는다.



이후 사용 방법으로는 다른 블로거의 내용을 참조 했다.


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

4. /WEB-INF/spring/appServlet/servlet-context.xml 파일을 수정하여 언어를 변경하기 위한 인터셉터를 등록합니다.

<interceptors>
    <beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <beans:property name="paramName" value="lang" />
    </beans:bean>
</interceptors>

servlet-context.xml 파일의 기본 네임스페이스가 mvc 이므로 바로 <interceptors> 를 사용했습니다. 만약 기본 네임스페이스가 beans 등으로 mvc가 아니라면 <mvc:interceptors> 로 사용되어야 할 것입니다.  이 설정의 의미는 /i18n.do?lang=ko, /i18n.do?lang=en 등으로 요청을 보내면 컨트롤러 앞단에서 요청을 가로채서 언어를 변경하는 역할을 수행합니다.



출처: https://offbyone.tistory.com/24 [쉬고 싶은 개발자]



5. Java 코드에서 다국어 메세지를 사용하는 방법 입니다. com.tistory.pentode.HomeController.java 파일 입니다.

package com.tistory.pentode;

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @Autowired
    SessionLocaleResolver localeResolver;

    @Autowired
    MessageSource messageSource;

    @RequestMapping(value = "/i18n.do", method = RequestMethod.GET)
    public String i18n(Locale locale, HttpServletRequest request, Model model) {

        // RequestMapingHandler로 부터 받은 Locale 객체를 출력해 봅니다.
        logger.info("Welcome i18n! The client locale is {}.", locale);

        // localeResolver 로부터 Locale 을 출력해 봅니다.
        logger.info("Session locale is {}.", localeResolver.resolveLocale(request));

        logger.info("site.title : {}", messageSource.getMessage("site.title", null, "default text", locale));
        logger.info("site.count : {}", messageSource.getMessage("site.count", new String[] {"첫번째"}, "default text", locale));
        logger.info("not.exist : {}", messageSource.getMessage("not.exist", null, "default text", locale));
        //logger.info("not.exist 기본값 없음 : {}", messageSource.getMessage("not.exist", null, locale));

        // JSP 페이지에서 EL 을 사용해서 arguments 를 넣을 수 있도록 값을 보낸다.

        model.addAttribute("siteCount", messageSource.getMessage("msg.first", null, locale));

        return "i18n";
   }

콘솔 출력 결과 입니다. (언어가 영어로 선택되어 있는 경우)

 

 

 

messageSource의 가장 기본 적인 사용법은 다음과 같습니다.

 

message.getMessage(메세지 키값, 대체할 값이 있을경우 값의 배열, 메세지 기본값, 로케일);

 

메세지 키값에 해당하는 값이 없을 경우 세번째 인자인 메세지 기본값이 출력됩니다.



출처: https://offbyone.tistory.com/24 [쉬고 싶은 개발자]


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



내가 적용한 부분은 jsp 부분에서 다음과 같이 호출 하였다.


<dt class="column-table__title column-table__title--border">
<spring:message code="site.title" />
</dt>


jsp 에서 사용 방법은 <spring:message code="properties 에서 설정한 key 값" />


더 자세히 찾아보면 다음고 같이 추가적인 옵션을 넣어서 사용할 수도 있다.


<spring:message code="properties 에서 설정한 key 값" arguments="value" text="default 값" />


arguments 옵션은 properties 파일 내 {0}, {1}... 등등으로 변수를 선언해주고 선언해준 변수에 값을 넣을 때 사용 된다.



여기 까지가 구글링을 통해 찾아본 다국어 적용 방법이고 이후는 프로젝트 상황에 맞게 추가적으로 진행한


내가 적용 하고 싶은 방법은 인터럽트를 통해서 Language Code를 설정하는 것이 아닌

로그인 성공하게 되면 로그인 한 사용자DB 정보 중 Language Code 값을 통해 웹 사이트의 Language Code를 설정하고자 한다.


에 대한 내용이다.


public void loginSuccess(HttpServletRequest request,HttpServletResponse response,
Authentication authentication) {

LoginUser loginUser = (LoginUser) authentication.getPrincipal();

/**
* 다국어 적용을 위한 초기 언어 설정
* */
if(loginUser.getLangCode().equals("zh_CN")) {
Locale locale = new Locale("zh","CN");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}
else if(loginUser.getLangCode().equals("en")) {
Locale locale = new Locale("en");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}
else {
Locale locale = new Locale("ko");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}

}


위의 loginSuccess 함수가 실행 되는 순서는 다음과 같다.


사용자 로그인 - springSecurity 설정파일에서 지정한 loginSuccessHandler 내 에서 실행 된다. 즉 로그인 이 성공하게 되면 실행되는 구조이다.

코드 내용은 loginUser에 로그인 한 사용자의 정보를 불러오고 그 loginUser 안에서 LangCode(Language Code) 값을 통해서 Locale 변수를 선언한다. 


언어 값을 지정하여 만들어진 locale 변수를 통해 SessionLocaleResover에 우리는 Locale(언어 값)을 지정한다. 

해당 작업은 위에서 설명한 인터럽트를 통해서 SessionLocaleResover 에 언어 값을 지정해주는 작업을 수동으로 로그인 성공시 지정하는 작업으로 이해하면 된다.


loginSuccessHandler 에서 위와 같은 작업을 진행하면 그 이후에는 세션이 끈기기 전까지는 계속해서 언어 값을 가지고 있을것이다. 


이후에는 위에서 설명한 java, jsp 등에서 사용하는 방법을 통해 다국어 메세지 처리 기능을 사용 할 수 있다.



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ





 


반응형

+ Recent posts