2016년 10월 17일 월요일

MyBatis 쿼리로그 출력 및 정렬 설정

1. pom.xml 에 추가한다.


<dependency>
    <groupId>org.lazyluke</groupId>
    <artifactId>log4jdbc-remix</artifactId>
    <version>0.2.7</version>
</dependency>

2. log4j.xml 을 수정한다.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>   
    </appender>
     
    <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p %m%n" />
        </layout>   
    </appender>
     
    <!-- Application Loggers -->
    <logger name="place" additivity="false">
        <level value="debug" />
        <appender-ref ref="console"/>
    </logger>
     
    <!-- Query Loggers -->
    <logger name="jdbc.sqlonly" additivity="false">  
        <level value="INFO"/>  
        <appender-ref ref="console-infolog"/>  
    </logger>
     
    <logger name="jdbc.resultsettable" additivity="false">  
        <level value="INFO"/>  
        <appender-ref ref="console"/>  
    </logger>  
 
    <!-- Root Logger -->
    <root>
        <priority value="off"/>
        <appender-ref ref="console" />
    </root>
     
</log4j:configuration>

3. context-datasource.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-3.0.xsd
                        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
    <!-- Connection Pool --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:포트/데이터베이스명"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
    
    <bean id="dataSourceLog4j" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg ref="dataSource" />
        <property name="logFormatter">
            <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
                <property name="loggingType" value="MULTI_LINE" />
                <property name="sqlPrefix" value="SQL         :  "/>
            </bean>
        </property>
    </bean>
    
</beans>

4. console을 확인한다.





Share:

2016년 10월 13일 목요일

스프링(Spring) 개발하기 - (7) mybatis 설정

1. pom.xml 에 mybatis 라이브러리를 추가한다. ( 추가 되어있다면 패스 )


<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis</artifactid>
    <version>3.2.2</version>
</dependency>
 
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis-spring</artifactid>
    <version>1.2.0</version>
</dependency>
 
<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-jdbc</artifactid>
    <version>${org.springframework-version}</version>
</dependency>
 
<dependency>
    <groupid>commons-dbcp</groupid>
    <artifactid>commons-dbcp</artifactid>
    <version>1.4</version>
</dependency>

2. mysql 라이브러리 추가 ( 추가 되어있다면 패스 )


<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

3. web.xml 설정 확인 ( 추가 되어있다면 패스 )

다음과 같은 코드가 있어야 한다.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/spring/context-*.xml</param-value>
</context-param>

4. mysql xml 설정

src/java/resource 폴더 밑에 config > spring 폴더를 만들고  context-datasource.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-3.0.xsd
                        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
     
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://주소:포트/데이터베이스명"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
</beans>

5. mybatis 와 spring 연동

5-1. config > spring 폴더에  context-mapper.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" />
    </bean>
     
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSession"/>
    </bean>  
</beans>

Share:

2016년 10월 11일 화요일

git 개념 및 자주사용할 명령어 정리

- git 은 스냅샷 기준으로 저장하고 svn 은 파일의 변화를 저장한다.
- merge는 두 브랜치를 병합 rebase는 한 브랜치의 히스토리를 다른 브랜치에 차례대로적용

사용해볼만한 기능

- tag
- stashing ( 브랜치 변경해야 되는데 커밋하기 애매할때 ) : stack 구조

자주사용할 명령어

- 수정했지만 아직 스테이지에 추가하지 않은 파일을 되돌릴때
git checkout --

- 수정했고 스테이지에 추가한 파일을 다시 스테이지에서 제거할때
git reset HEAD

- 수정했고 로컬저장소에 commit한 파일을 되돌릴 때
git fetch origin
git reset --hard origin/master
Share:

스프링(Spring) 개발하기 - (6) Log4j 및 Interceptor 설정

1. Log4j 설정

log4j.xml파일을 수정한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>   
    </appender>
     
    <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p %m%n" />
        </layout>   
    </appender>
     
    <!-- Application Loggers -->
    <logger name="place" additivity="false">
        <level value="debug" />
        <appender-ref ref="console"/>
    </logger>
     
    <!-- Query Loggers -->
    <logger name="jdbc.sqlonly" additivity="false">  
        <level value="INFO"/>  
        <appender-ref ref="console-infolog"/>  
    </logger>
     
    <logger name="jdbc.resultsettable" additivity="false">  
        <level value="INFO"/>  
        <appender-ref ref="console"/>  
    </logger>  
 
    <!-- Root Logger -->
    <root>
        <priority value="off"/>
        <appender-ref ref="console" />
    </root>
     
</log4j:configuration>

2. Interceptor 설정

2-1. src/main/java/ 패키지 내에 place 패키지와 common 패키지를 생성한다.

2-2. LoggerInterceptor.java 파일을 생성하고 내용을 수정한다.



import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


public class LoggerInterceptor extends HandlerInterceptorAdapter{
 protected Log log = LogFactory.getLog(LoggerInterceptor.class);
 
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
   throws Exception {
  if (log.isDebugEnabled()) {
            log.debug("======================================          START         ======================================");
            log.debug(" Request URI \t:  " + request.getRequestURI());
        }
  return super.preHandle(request, response, handler);
 }
 
 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
   ModelAndView modelAndView) throws Exception {
   if (log.isDebugEnabled()) {
             log.debug("======================================           END          ======================================\n");
      }
 }

}

3. 인터셉터와 log4j가 적용 됐는지 확인한다.

3-1. place.sample.controller 패키지를 만들고 testController.java 파일을 생성한다.


3-2. testController.java에 다음의 소스를 붙여넣는다.


@Controller
public class testController {
 Logger log = Logger.getLogger(this.getClass());
    
    @RequestMapping(value="/place/testList.do")
    public ModelAndView openSampleList(Map commandMap) throws Exception{
        ModelAndView mv = new ModelAndView("");
        log.debug("인터셉터 테스트");
         
        return mv;
    }
}

3-3. index.jsp를 수정한다.


3-4. Tomcat Server 실행후 주소창에 localhost:8080/place 를 입력한다.
      View를 지정하지 않았으니 404에러가 보일것이다.
      이클립스 console창만 확인하면 된다. 아래와 같은 그림이 나오면 성공이다.






Share:

2016년 9월 19일 월요일

프로젝트 Github 연동 .gitignore 설정 및 업데이트

1. 해당 프로젝트 root 폴더에서 오른쪽 버튼 클릭후 git bash here을 클릭한다.



2. vi .gitignore 명령어 입력한다.

3. 아무내용 입력후 esc 누르고 :wq 를 입력한다. ( 저장하고 종료 명령어 )

4. 메모장으로 파일을 열어 수정한다.


# Directories #
/build/
/bin/
target/
.idea
classes/
META-INF/
  
# OS Files #
.DS_Store
  
*.class
  
# Package Files #
*.jar
*.war
*.ear
*.db
  
######################
# Windows
######################
  
# Windows image file caches
Thumbs.db 
  
# Folder config file
Desktop.ini
  
######################
# OSX
######################
  
.DS_Store
.svn
  
# Thumbnails
._*
  
# Files that might appear on external disk
.Spotlight-V100
.Trashes
  
  
######################
# Eclipse
######################
  
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
.classpath
.settings/
.loadpath
/src/main/resources/rebel.xml
# External tool builders
.externalToolBuilders/
  
# Locally stored "Eclipse launch configurations"
*.launch
  
# CDT-specific
.cproject
  
# PDT-specific
.buildpath

# Created by https://www.gitignore.io/api/intellij

### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries

# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml

#ignore
*.iml

# Gradle:
.idea/**/gradle.xml
.idea/**/libraries

# CMake
cmake-build-debug/

# Mongo Explorer plugin:
.idea/**/mongoSettings.xml

## File-based project format:
*.iws

## Plugin-specific files:

# IntelliJ
/out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721

# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr

# Sonarlint plugin
.idea/sonarlint

# End of https://www.gitignore.io/api/intellij


5. 완료.

* git 사용도중에 gitignore 설정시 다음과 같이 실행하면 적용된다.
* git ignore 파일을 commit 한 후 아래와 같이 명령어를 실행한다.

$ git rm -r --cached .
$ git add .
$ git commit -m "git ignore add"
$ git push


관련사이트

Share:

2016년 9월 2일 금요일

스프링(Spring) 개발하기 - (5) 스프링 설정파일

1. pom.xml 수정




2. index.jsp 추가


2-1. webapp 폴더에 index.jsp 를 생성한다.


2-2. index.jsp 소스를 수정한다.

<body>
 <h3>index page</h3>
</body>

2-3. web.xml 에서 index.jsp 설정을 추가한다.

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 
 <welcome-file-list>
       <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

2-4. Server 실행후 http://localhost:8080/프로젝트이름/ 주소창에 입력한다.


3. Servlet 설정 변경


web.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>
    
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
를 다음과 같이 변경한다.

<servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/config/*-servlet.xml 
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>


4. contextConfigLocation 변경


4-1. WEB-INF 폴더 밑에 config 폴더를 생성후 servlet-context.xml을 복사해서 action-servlet.xml 로 이름을 변경한다. spring 폴더는 삭제한다.


4-2. web.xml 소스를 수정한다.


<servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/config/*-servlet.xml 
     </param-value>
        </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>

5. UTF-8 설정


web.xml에 추가한다.


<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

6. 기타 설정

기존 contextConfigLocation 설정을 수정한다.

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value></param-value>
</context-param>

7. 최종 web.xml


<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 
 <welcome-file-list>
             <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
 <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:config/spring/context-*.xml</param-value>
 </context-param>
 
 <!-- Creates the Spring Container shared by all Servlets and Filters -->
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 <!-- Processes application requests -->
 <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/config/*-servlet.xml 
         </param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
         <servlet-name>action</servlet-name>
         <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 
 <filter>
     <filter-name>encodingFilter</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>encodingFilter</filter-name>
 <url-pattern>*.do</url-pattern>
 </filter-mapping>

</web-app>
Share:

2016년 9월 1일 목요일

이클립스(Eclipse) 프로젝트 Github 연동

0. https://git-scm.com/downloads 에서 git을 설치한다.

1. https://github.com/ 에서 계정을 만든다.

2. repository 를 생성하고 주소를 복사한다.

3. 해당 프로젝트 우클릭 하고 Team > Share Project 선택한다.


4. Use or create repository in parent folder of project 체크박스를 선택하고 Finish 버튼을 클릭한다.


5. 해당 프로젝트 폴더에서 빈곳에 오른쪽 버튼을 클릭하고 Git Bash Here 클릭한다.



6. Git Bash에서 해당 명령어 2개를 입력한다.

  • git config --global user.name "유저이름" 
  • git config --global user.email "UserMail@youremail.com" 


7. 해당 프로젝트 우클릭 하고 Team > Add to Index 선택한다.

8. 해당 프로젝트 우클릭 하고 Team > Commit 선택한다.

9. URI에 git에서 생성한 repository 주소를 입력하고 User / Password ( Github계정)  를 입력하고 Finish 버튼을 클릭한다.

10. 자신의 GitHub주소로 들어가 업로드 되었는지 확인한다.


Share:

스프링(Spring) 개발하기 - (4) 스프링 프로젝트 생성

1.  스프링 프로젝트 생성


1-1. File > New > Other 를 선택한다.

1-2. Spring > Spring Legacy Project를 선택하고 Next 버튼을 클릭한다.


1-3. Project name을 입력하고 Spring MVC Project를 선택하고 Next를 클릭한다.


1-4. 3레벨 이상 형식으로 package명을 입력하고 Finish 버튼을 클릭한다.


1-4. 스프링 프로젝트 생성 완료



2. 프로젝트 실행


1. Server 시작후 주소창에 http://localhost:8080/프로젝트네임/ 을 입력한다.





Share:

2016년 8월 31일 수요일

스프링(Spring) 개발하기 - (3) 개발환경 플러그인 설치 STS / Git

1. STS 플러그인 설치


1-1. 상단 Help > Eclipse Marketplace를 선택한다.

1-2. Marketplace에서 STS를 검색한다.

1-3. Spring Tool Suite for Eclipse 를 선택하고 Install버튼을 클릭한다.



1-4. 설치항목 선택후 Confirm 버튼을 클릭한다.


1.5. 동의버튼 선택후 Finish 버튼을 클릭한다.


1-6. 설치가 진행된다.


1-7. 설치가 완료되면 재시작 할거냐고 물어본다 Yes 버튼을 클릭한다.


1-8. STS 정상적인 설치여부 확인을 위해 상단 File > New > Others 선택후 spring이 있는지 확인한다.


2. Git 설치


2-1. 상단 Help > Eclipse Marketplace를 선택한다.

2-2. Marketplace에서 Egit를 검색한다.

2-3. Egit - Git Team Provider 을 Install 한다.


2-4. Git 정상적인 설치여부 확인을 위해 상단 Windows > Open Perspective > Other 선택하고 Git 선택후 OK버튼을 클릭한다.


2-5. Git 선택 박스가 추가된다.



3. 이클립스 Perspective 및 하단 View 설정


3-1. 오른쪽 상단에 있는 Open Perspective 버튼을 클릭한다.



3-2. Git 하고 Team Synchronizing를 추가한다.


3-3. 상단 Windows > Open View 선택후 많이 사용하는 Console, Progress, Search 를 추가한다.





Share:

스프링(Spring) 개발하기 - (2) 개발환경 Tomcat / Maven 설정

1. Tomcat 설정


1-1. 상단 Window > Preferences 선택한다.

1-2. Server > Runtime Environment 선택한다.

1-3. Add.. 버튼을 클릭한다.

1-4. Apache tomcat 버전 선택하고 Next > 버튼을 클릭한다.

1-5. Tomcat directory 는 develop 안에 있는 C:\develop\Tomcat 7.0 선택한다.


1-6. 목록 확인후 OK버튼을 클릭한다.


1-7. View Tab에 있는 Servers를 선택한다. ( 없으면 상단 Window - Show View 에서 Server 선택)

1-8. No Servers are available. Click this link to create a new server 클릭한다.


1-9. Tomcat v7.0 Server 선택후 Nexr> 버튼을 클릭하고  Finish 버튼을 클릭한다.

1-10. 서버를 선택하고 ▷ 버튼 ( 또는 단축키 Ctrl + Alt + R 또는 우클릭 Start ) 을 클릭한다.



1-11. console에 다음과 같이 나오면 성공




2.1 Maven Repository 변경 ( 라이브러리가 다운받아지는 곳 )


2-1. C:\develop\apache-maven-3.3.9\conf 폴더로 이동하여 settings.xml 파일을 연다.

2-2. develop 폴더에서 관리할 예정이니 C:\develop\apache-maven-3.3.9 폴더로 이동  repository 폴더를 생성한다.



2-3. Settings.xml 에서 <localRepository>/path/to/local/repo</localRepository> 부분을 찾 아서 주석을 해제하고 경로를 C:\develop\apache-maven-3.3.9\repository 로 변경해 주고 저장한다.




2.2 이클립스에서 Maven 설정 


2-1. 상단 Window > Preference를 선택한다.

2-2. Maven > User Setting를 선택한다.

2-3. User Settings에서 Browse 버튼을 클릭후 C:\develop\apache-maven-3.3.9\conf\settings.xml를 선택후 OK버튼을 클릭한다.


3. 추후 형상관리를 위해 컴파일 결과가 있는 target폴더 제외


3-1. 상단 Window > Preferences를 선택한다.

3-2. Team > Ignored Resources를 선택한다.

3-3. Add Pattern 버튼을 선택한다.

3-4. */target/* 를 추가하고 OK버튼을 클릭한다..


3-5. OK버튼을 클릭한다.





Share:

2016년 8월 29일 월요일

스프링(Spring) 개발하기 - (1) 개발환경 다운로드 및 Eclipse 설정

0. 개발환경 버전


IED : Eclipse Neon

JDK : jdk-8u101

Tomcat : Tomcat 7.0

Maven : Maven 3.3.9

1. 개발환경 다운로드


1.1 Eclipse 다운
www.eclipse.org 접속후 Java EE 버전 다운로드

1.2 JDK 다운로드
http://www.oracle.com/technetwork/java/javase/downloads/index.html
접속후 SE 버전 다운로드

1.3 Tomcat 다운로드
http://tomcat.apache.org/ 접속후 다운로드

1.4 Maven 다운로드
http://maven.apache.org/ 접속후 Binary zip archive 다운로드

2. 개발 환경 구성


2.1 폴더 구성
C드라이브 develop 폴더 생성후 다운로드한 폴더를 넣는다. 폴더안에 workspace 폴더도 만들어준다.

JDK는 실행하여 설치한다. 설치하면 C:\Program Files\Java\jdk1.8.0_101 폴더가 생긴다.
설치한 jdk 폴더를 복사하여 develop 폴더에 넣어준다.


2.2 경로 설정
eclipse 폴더에 있는 eclipse.ini 실행한다.

설정 참고 : http://lalwr.blogspot.kr/2017/03/eclipse-ini.html

1. JDK 경로를 추가한다. ( vmargs 옵션 위쪽에 추가해야 한다. )
-vm
C:\develop\jdk1.8.0_101\bin\javaw.exe
※ Exclipse Neon버전을 사용시 JDK 1.8이상버전을 사용해야 한다.
(이클립스 실행시 error 발생시 -vmargs 삭제 해볼것 )

2. -vmargs 설정을 수정한다.  ( RAM이 8G 이상인 경우만 2048로 한다. 4G는 1024)
-Xms1024, -Xmx2048 로 수정한다.


eclipse.ini 저장하고 C:\develop\eclipse 에 있는 eclipse.exe를 실행한다.
설정이 제대로 되었다면 아래 그림과 같은 창이 뜰것이다.


workspace를  C:\develop\workspace 수정하고 이 폴더를 계속 사용할려면 Use this as the default and do not ask again 를 체크해준다.

다음 그림과 같은 창이 뜬다면 기본 환경은 완료.



3. 개발환경 UTF-8 설정


3-1. 상단 Window > Preferences 을 선택한다.

3-2. 다음 목록 encoding을 UTF-8로 설정한다.
  • General >Workspace
  • General >Editors > Spelling
  • Web > CSS Files
  • Web > HTML Files
  • Web > JSP Files
  • Web > XML Files








Share:

2016년 8월 4일 목요일

sublimetext 단축키 및 플러그인

- 기본단축키

Editing
- Ctrl+A 전체선택
- Ctrl+O 열기
- Ctrl+S 저장하기
- Ctrl+C 복사하기
- Ctrl+V 붙여넣기
- Ctrl+F Text 검색
- Ctrl+Z 이전작업으로가기
- Ctrl+Y 다음작업으로가기
- Ctrl+D 동일 단어 선택기능 (한단어를 선택한 뒤 Ctrl+D를 한번 누를 때 마다 다음 동일 단어를 추가로 선택합니다)
- Ctrl+Shift+F 동일 폴더 내에서 단어나 문장을 찾아줍니다.
- Ctrl+G 원하는 행으로 바로 이동해주며
- Ctrl+P 폴더트리 살펴보지 않고 원하는 파일을 바로 열 수 있도록 해줍니다. ( @ 입력 후 검색시 : 클래스, 메소드 검색, # 입력 후 검색시 : 텍스트 검색, : 입력 후 (숫자)검색시 : 라인 검색 )
- Ctrl+[ 행 들여쓰기 (Mac : CMD+[ )
- Ctrl+] 내어쓰기(Mac : CMD+] )
- Ctrl+h : 단어를 찾아서 바꾸기
- Ctrl+SHIFT+[ 코드블럭 접기 (Mac : CMD+OPT+[ )
- Ctrl+SHIFT+] 코드블럭 펴기 (Mac : CMD+OPT+] )
- Ctrl+SHIFT+K 행을 삭제합니다.
- Ctrl+ENTER 다음행에 입력할 수 있는 공간을 만들어줍니다.
- Ctrl+SHIFT+ENTER 이전행에 입력할 수 있는 공간을 만들어줍니다.
- Ctrl+SHIFT+UP,Ctrl+SHIFT+DOWN 해당 행을 그 윗행이나 아랫행으로 자리를 옮깁니다. 만약 영역을 설정하면 영역에 포함된 모든 행의 위치를 옮깁니다. (Mac : CMD+SHIFT+UP, CMD+SHIFT+DOWN)
- Ctrl+L 커서가 위치한 행을 선택합니다.
- Ctrl+D 커서가 위치한 부분의 단어를 선택합니다. 반복해서 누를 경우 그 다음에 나오는 동일단어를 찾아서 선택합니다.
- Ctrl+KK 커서위치부터 행끝까지 삭제
- Ctrl+K+DEL행시작부터 커서위치까지 삭제
- Ctrl+SHIFT+D 현재 행 복사하여 붙여넣기, 영역을 설정하면 설정 된 영역만 복사하여 붙여넣기 (Ctrl+C 후 Ctrl+V와 같습니다.)
- Ctrl+J 다음행을 같은 행으로 당긴 뒤 당겨온 행의 처음으로 커서 이동
- Ctrl+ / 현재 행 주석처리, 반복하면 주석처리 취소, 영역 선택시에는 선택한 부분만 주석처리
- Ctrl+SHIFT+/ 현재위치에 주석넣을 블록 생김
- Ctrl+Z, Ctrl+U 이전작업으로 돌아가기
- Ctrl+Y 다음작업으로 돌아가기, 돌아갈 작업이 없을 경우 가장 마지막으로 했던 작업을 함
- Ctrl+KU 해당단어 모두 대문자로
- Ctrl+KL 해당단어 모두 소문자로
- Ctrl + DEL(Backspace) 단어단위 삭제
- SHFT + DEL(BackSpace) 현재커서가 있는 줄 삭제

Navigation/Goto Anywhere
- Ctrl+P 열려있는 폴더내의 파일을 빨리 찾아 열 수 있다. (Ctrl+P 후 @를 달아주면 Ctrl+R과 같다.#를 달아주면 Ctrl+ ; 과 같다. :를 달아주면 Ctrl+G과 같다.) (Mac : CMD+P)
- Ctrl+R 파일내의 css 선택자나 id를 찾아 이동한다.
- Ctrl+ ; 파일내의 단어를 찾아 이동한다.
- Ctrl+G 파일내의 행을 찾아 이동한다.

General 
- Ctrl+SHIFT+P 명령어 목록을 보여줌-command prompt (Mac : CMD+SHIFT+P)
- Ctrl+KB 사이드바를 숨겼다 꺼냈다 한다

Find/Replace 
- Ctrl+F 해당 문서에서 단어 찾기
- Ctrl+H 교체  (Mac : CMD+OPT+F)
- Ctrl+SHIFT+F 전체 파일에서 단어가 포함 된 파일 찾기 (Mac : CMD+SHIFT+F)

Tabs 
- Ctrl+SHIFT+t 가장 최근에 닫은 문서(탭)열기
- Ctrl+PgDn,Ctrl+PgUp 여러 창이 열려있는 경우, 다음창으로 이동 (이동순서는 두 버튼이 반대로 실행됨)
- Ctrl+RIGHT, Ctrl+LEFT 해당위치에서 다음(이전)단어로 이동
- Ctrl+SHIFT + ,  태그 닫기와 열기

Split window
- Alt+SHIFT+2~4 숫자 개수만큼 창 분할하기(세로 분할)
- Alt+SHIFT+1 1개의 창으로 보여지기
- Alt+SHIFT+5 2행 2열 4개의 창으로 분할하기
- Ctrl+[1,2,3,4] 여러창으로 보인 상태에서 해당 번호의 창으로 커서이동
- Ctrl+SHIFT+[1,2,3,4] 여러창으로 보인 상태에서 해당 번호의 창으로 현재창을 이동

Etc
- F11  전체화면모드
- Only Mac
- Ctrl+M 현재 코드의 닫는 괄호로 이동, 반복시 여는 괄호로 이동
- Ctrl+SHIFT+M현재 괄호의 모든 내용을 선택(중괄호, 대괄호, 괄호)
- CMD+SHIFT+V복사한 단어나 문장을 붙일 때 들여쓰기를 같이 한다.

- 플러그인(plugin)


1. Aligment

단축키 :  원하는 부분을 블럭을 잡고 Ctrl+Shift+a

- 구분자 설정 setting - default 에서 alignment_chars 수정

2. AdvancedNewFile

단축키 :  ctrl+alt+n

ex ) css/style.css 입력하면 css폴더에 style.css 파일 생성.

3. AutoBackups

자동백업기능

4. DocBlockr

단축키 : /** 입력 후 Enter

- 자동으로 주석으로 달아준다.

5. SublimeCodeIntel

단축키 : 변수명에 대고 ALT+Click 또는 CTRL+F3 을 누르면 변수가 지정되어 있는 파일로 자동으로 이동해 준다.

- 웹 에서 쓰이는 대부분의 언어(JavaScript, Mason, XBL, XUL, RHTML, SCSS, Python, HTML, Ruby, Python3, XML, Sass, XSLT, Django, HTML5, Perl, CSS, Twig, Less, Smarty, Node.js, Tcl, TemplateToolkit, PHP)에 대해서 변수를 찾아주는 기능을 한다.

6. Sublime Linter

단축키 :
- ctrl+alt+ l : 에러 개수를 팝업으로 알려줌
- ctrl+alt+ e : 커서에서 아래쪽 방향으로 에러가 발생한 지점으로 이동
- ctrl+alt+ shift + e : 커서에서 위쪽 방향으로 에러가 발생한 지점으로 이동
- Preferences > Package Setting > SublimeLinter > Key Bindings - Default에서 단축키를 변경할 수 있다.

- Node.js를 필수 설치
- 링크 : http://www.sublimelinter.com/en/latest/
- Python, javascript, css, ruby, c/c++, coffeescript, git, haml, html, java, lua, objective-j, perl, php, puppet, xml 코드에 오류가 있을 경우 알려준다.

7. ConvertToUTF8

- link : https://github.com/seanliang/ConvertToUTF8
- 한글이 안깨지도록 도와준다

8. HTML-CSS-JS Prettify 

단축키 : Ctrl + Shift + H

- 자동으로 줄을 정렬시켜주는 Package 입니다.
- Node.js를 필수 설치
- 패키지 세팅 : 들여쓰기 Size 설정(Preferences - Package Settings - HTML/CSS/JS Prettify - set Prettify Preferences ) → indent_size 의 값 조절

9. Bracket Highlighter

- link : https://github.com/facelessuser/BracketHighlighter
{},[],<>,"",'',() 와 같이 열리고 닫히는 기호가 쌍으로 존재해야 하는 코드를 하이라이트 처리해주는 확장 기능이다.
아래처럼 하이라이트 된다.

10. IMESupport

- 한글입력할때 텍스트창에서 입력값을 보여준다

11. preview

단축키 : F12

- 작업 중이던 문서를 미리 웹브라우저 보여준다.




Share:

2016년 8월 2일 화요일

a 태그에서 onclick return false를 사용하는 이유

a 태그에서 href="#" 를 사용 할시 페이지 상단으로 위치가 이동한다.

하지만
function aa(){
   return false;
}
<a href="#" onclick = "aa(); return false;" />

onclick 에서 return false; 를 사용하면 기본 속성을 무시하고 페이지가 이동하지 않는다.

1. <a href="#" onclick = "aa(); return false;" />
2. <a href="#" onclick = "return aa();"  />

1번과 2번 소스 2개다 페이지가 이동하지 않는다.


Share:

phpmyadmin 에서 excel import 하는법

★ 데이터 작성법
1. 양식 excel 에 데이터를 넣는다.
( 해당 DB내보내기 에서 excel 다운받는다. )
2. 다른이름으로 저장을 선택해 csv 로 선택한다.
3. 다른이름으로 저장한 파일을 메모장으로 열어서 첫줄은 지우고 다른이름으로 저장 선택후 저장 버튼 왼쪽에 있는 인코딩을 UTF-8로 저장후 저장한다.


★데이터 넣는법
1. 브라우저 켠후 주소 pypmyadmin 주소 입력
2. 로그인 접속후
3. 해당 DB에서 상단 Import 클릭
4. 파일선택후 파일 첨부 ( csv로 저장한 파일 )
5. 하단 CSV using LOAD DATA 선택
6. 필드 구분자 , 입력  //  열(칼럼) 이름에
메모장에서 삭제한 첫줄 입력
7. 실행 버튼 클릭






Share:

2016년 7월 27일 수요일

이클립스 소스 파일깨짐 복구방법

1. Window - > Preferences -> Content Types -> Java Source File -> Default encoding : UTF-8 -> Update 버튼 클릭

안되면

2. Window -> Preference -> General -> Workspace ->
Text file encoding 선택에서 UTF-8 설정

그래도 안되거나 update 를 다시 하고싶을때는

3. Window - > Preferences -> Content Types -> Java Source File -> Default encoding : EUC-KR -> Update 버튼 클릭

나중에 프로젝트 추가시 깨지면

해당 프로젝트 Properties에서 
Text file encoding 선택에서 UTF-8 또는 EUC-KR 설정
Share:

2016년 6월 13일 월요일

2016년 5월 16일 월요일

skype 광고 없애기

1. 광고 없애기

익스플로어 도구 - 인터넷 옵션 - 보안
제한된 사이트 클릭후
https://apps.skype.com
추가 후 저장후 스카이프 재시작

2. 광고 개체 틀 제거

C:\사용자\<Windows 사용자 이름>\AppData\Roaming\Skype\<스카이프id>
config.xml 파일을 열고
<AdvertPlaceholder>1</AdvertPlaceholder> 을
<AdvertPlaceholder>0</AdvertPlaceholder>
으로 변경후 스카이프를 재시작한다.

Share:

2016년 4월 21일 목요일

그룹별 최신데이터 가져오기


SELECT  a, b, c
FROM    (
        SELECT  a, b, c
                ROW_NUMBER() OVER (PARTITION BY code ORDER By date desc ) as ROW
        FROM    aa
        ) q
WHERE   ROW =1
code별 그룹지어서 date 가 제일 최신인 데이터 1개만 가지고오는 sql
Share:

2016년 4월 8일 금요일

mysql 같은 테이블 값 불러와서 넣는법

*insert

( SELECT * FROM ( SELECT 컬럼 FROM 테이블 WHERE ID= #{id} ) as temp )


*update

update table set column=1 where column2 IN (select column from table)
이렇게 하면 오류나지만 아래 처럼하면 사용가능

update table set column=1 where column2 IN (select * from (select column from table) as temp)

Share:

ajax 값 한글데이터 물음표 현상

* java

1.
JSON으로 주고받을시
produces = "application/json; charset=utf8" 
추가

2.
JSONObject resultMsg =new JSONObject();

List<aa> value= aa.list(valVO);
resultMsg.put("value", value);

return resultMsg.toString();

* ajax

1.
$.ajax({                                    
url: "${contextPath}/aa/aa/abc",                  
data: {
  val: $('#val option:selected').val()                                                          
},
dataType: 'json',              
success: function(data)        
{
  $('#aaa').html('<option>선택</option>');
for(var i =0; i < data.배열.length; i++){
var  Data = data.배열[i];
$('#aaa').append('<option value='+ Data .id+'>'+ Data .nm +'</option>');
}
}
});




Share:

2016년 4월 4일 월요일

bootstrap datepicker 사용법

1.Import

<link rel="stylesheet" type="text/css" href="${contextPath}/resources/bootstrap/css/datepicker3.css" />
<script type="text/javascript" src="${contextPath}/resources/bootstrap/js/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="${contextPath}/resources/bootstrap/js/bootstrap-datepicker.kr.js"></script>

2. js

$('#dateRangePicker').datepicker({
format: "yyyy-mm-dd",
language: "kr"
 });

3. html

<div class="input-group input-append date" id="dateRangePicker"> </div>

4. 파일
bootstrap-datepicker.js
bootstrap-datepicker.kr.js
datepicker3.css

2016년 3월 11일 금요일

2016년 3월 8일 화요일

Adapter 패턴 vs. Facade 패턴 vs. Decorator 패턴

1) 어댑터 패턴


1-1. 정의

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.

1-2. 클래스 어댑터 패턴

단점: 상속(Generalzation)을 활용하기때문에 유연하지 못하다.
장점: 어댑터(Adapter)를 전체를 다시 구현할 필요가 없다.(빠르다)


주의: 클래스 어댑터에서는 다중상속을 이용하기 때문에 자바에서는 쓸 수 없습니다.
쓸수있습니다.(간접적 다중상속 지원)




- 코드


public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee.speificRequest()");
}
}

public interface Target {
public void request();
}

public class Adapter extends Adaptee implements Target {
public void request() {
this.specificRequest(); // 다중상속
}
}

public class Client {
public static void main(String[] args) {
Target target = new Adapter();

target.request();
}
}

- 결과 : "Adaptee.speificRequest()" 출력

1-3. 객체 어댑터 패턴

단점: 어댑터(Adapter)클래스의 대부분의 코드를 구현해야하기때문에 효율적이지 못하다
장점: 구성(Composition)을 사용하기 때문에 더 뛰어나다.(유연하다)


- 코드


public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee.speificRequest()");
}
}

public interface Target {
public void request();
}

public class Adapter implements Target {
Adaptee adaptee = new Adaptee(); // 객체를 만들고

public void request() {
adaptee.specificRequest(); // 객체를 연결한다.
}
}

public class Client {
public static void main(String[] args) {
Target target = new Adapter();

target.request();
}
}



- 결과 : "Adaptee.speificRequest()" 출력


2) 퍼사드 패턴


2-1. 정의

퍼사드는 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다.

- 퍼사드는 소프트웨어 라이브러리를 쉽게 사용할 수 있게 해준다. 또한 퍼사드는 소프트웨어 라이브러리를 쉽게 이해할 수 있게 해 준다. 퍼사드는 공통적인 작업에 대해 간편한 메소드들을 제공해준다.
- 퍼사드는 라이브러리를 사용하는 코드들을 좀 더 읽기 쉽게 해준다.
- 퍼사드는 라이브러리 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜준다. 대부분의 바깥쪽의 코드가 퍼사드를 이용하기 때문에 시스템을 개발하는 데 있어 유연성이 향상된다.
- 퍼사드는 좋게 작성되지 않은 API의 집합을 하나의 좋게 작성된 API로 감싸준다.

래퍼(wrapper)가 특정 인터페이스를 준수해야 하며, 폴리모픽 기능을 지원해야 할 경우에는 어댑터 패턴을 쓴다. 단지, 쉽고 단순한 인터페이스를 이용하고 싶을 경우에는 퍼사드를 쓴다.


- 퍼사드
퍼사드 클래스는 패키지 1,2,3 및 그림에 나오지 않은 그 밖의 응용 프로그램 코드와 상호 동작한다.
- 클라이언트
패키지 내의 리소스들을 접근하기 위해 퍼사드 클래스를 쓰는 객체들이다.
- 패키지
소프트웨어 라이브러리 / API 집합이다. 퍼사드 클래스를 통해 접근된다.



/* Complex parts */

class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}

class Memory {
public void load(long position, byte[] data) {
...
}
}

class HardDrive {
public byte[] read(long lba, int size) {
...
}
}

/* Fa?ade */

class Computer {
public void startComputer() {
CPU cpu = new CPU();
Memory memory = new Memory();
HardDrive hardDrive = new HardDreive();
cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
}
}

/* Client */

class You {
public static void main(String[] args) throws ParseException {
Computer facade = /* grab a facade instance */;
facade.startComputer();
}
}


3) Adapter 패턴 vs. Facade 패턴 vs. Decorator 패턴 차이점


각 패턴의 용도들을 비교해 차이점을 알아보자 !

* Adapter 패턴 : 한 인터페이스를 다른 인터페이스로 변환 (for 호환성)
인터페이스를 변경해서 클라이언트에서 필요로 하는 인터페이스로 적응시키기 위한 용도.

* Facade 패턴 : 인터페이스를 간단하게 바꿈 (for 간편함)
어떤 서브시스템에 대한 간단한 인터페이스를 제공하기 위한 용도.

* Decorator 패턴 : 인터페이스를 바꾸지 않고 책임(기능)만 추가함 (for 기능 추가)

객체를 감싸서 새로운 행동을 추가하기 위한 용도.

4) 최소 지식 원칙 (Principle of Least Knowledge) 또는 데메테르의 법칙 (Law of Demeter)

- 참고로 둘 다 같은 말이다.
- 정말 친한 친구들하고만 얘기하라.
- 최소 지식 원칙에 따르면 객체 사이의 상호작용은 될 수 있으면 아주 가까운 '친구' 사이에서만 허용하는 것이 좋다 !
- 이를 잘 따르면 여러 클래스들이 복잡하게 얽힌 시스템의 한 부분을 변경했을 때, 다른 부분까지
줄줄이 고쳐야 되는 상황을 미리 방지할 수 있다.

- 이 원칙을 지키기 위한 가이드 라인 : 다음 4 종류의 객체의 메소드만 호출하면 된다.
(1) 객체 자체
(2) 메소드에 매개변수로 전달된 객체
(3) 그 메소드에서 생성하거나 인스턴스를 만든 객체
(4) 그 객체에 속하는 구성요소
구성요소는 인스턴스 변수에 의해 참조되는 객체를 의미. 즉, 'A에는 B가 있다' 관계에 있는 객체.

- 위 가이드 라인에 따르면 다른 메소드를 호출해서 리턴 받은 객체의 메소드를 호출하는 건 바람직하지 않다고 한다.

- 객체들 사이의 의존성을 낮추고, 소프트웨어 관리가 더 용이해질 수는 있으나 단점도 있다.
다른 구성요소에 대한 메소드 호출을 처리하기 위해 'Wrapper' 클래스를 더 만들어야 할 수도 있다.
그러다 보면 시스템이 더 복잡해지면서 개발 시간이 늘어나고 성능 저하를 불러일으키는 요인이 될 것이다.

5) 객체지향의 원칙 

1. 바뀌는 부분은 캡슐화 한다.
2. 상속보다는 구성을 활용한다.
3. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
5. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다(OCP).
6. 추상화된 것에 의존해라. 구상 클래스에 의존해서는 안 된다(의존성 뒤집기 법칙).
7. 친한 친구들하고만 이야기한다(최소 지식 원칙).


6) 총 정리 

- 기존 클래스를 사용하려고 하는데 인터페이스가 맞지 않으면 어댑터를 쓰자.
- 큰 인터페이스 or 여러 인터페이스를 단순화 시키거나 통합시켜야 되는 경우에는 퍼사드를 쓰자.

- 어댑터는 인터페이스를 클라이언트가 원하는 인터페이스로 바꿔주는 역할을 한다.
- 퍼사드는 클라이언트를 복잡한 서브시스템과 분리시켜주는 역할을 한다.

- 어댑터를 구현할 때는 Target 인터페이스의 크기와 구조에 따라 코딩해야 할 분량이 결정된다.
- 퍼사드 패턴에서는 서브시스템을 가지고 퍼사드를 만들고, 실제 작업은 서브클래스에 맡긴다.

- 어댑터 패턴에서는 객체 어댑터 패턴 vs. 클래스 어댑터 패턴(다중상속必)이 있다.
- 어댑터는 다중 어댑터로 만들 수 있고, 퍼사드는 한 서브시스템에 여러 개 만들어도 된다.

- 어댑터, 퍼사드 모두 인터페이스를 바꿔주는데 !
Adapter : 인터페이스를 변환
Facade : 인터페이스를 통합/단순화 시킴
Decorator : 인터페이스를 바꾸지 않고, 객체를 감싸서 새로운 기능을 추가할 수 있다.


*reference

  • http://wiki.gurubee.net/pages/viewpage.action?pageId=1507407#7.%EC%96%B4%EB%8C%91%ED%84%B0%ED%8C%A8%ED%84%B4%EA%B3%BC%ED%8D%BC%EC%82%AC%EB%93%9C%ED%8C%A8%ED%84%B4-33.%EC%98%88%EC%A0%9C%3AXML%ED%8A%B8%EB%A6%AC
  • http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C7%EA%B0%95-Adapter-%ED%8C%A8%ED%84%B4%EA%B3%BC-Facade-%ED%8C%A8%ED%84%B4
  • https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4


Share:

logback을 사용해야 하는 이유

“Log4j” (현재는 Apache Logging Service라는 Top Project)는  “Ceki G?lc?“라는
개발자가 최초로 만들었습니다.
“Log4J“는 java world에서 “가장 많이 사용하고 있는 logger“라고 감히 말씀 드릴수 있습니다.

이러한 성공에 힘을 입어 “Ceki G?lc?“는 좀더 “Logger“에 대해서 깊은 프로젝트를 시작했고,
그것이 바로 “SLF4J” 와 “LOGBack” 입니다.

“SLF4J“는 “로깅 구현체“라기 보다는 “Logging Facade” 입니다.
(※ facade pattern 참조)


“일명 창구 일원화” 패턴인데, “SLF4J“의 API를 사용하면, 구현체의 종류와 상관없이
“일관된 로깅 코드“를 작성할 수있으며,  “Apache Commons Logging“를 사용하다가
“Log4J“로 변경을 할 경우 최소한의 수정으로 구현체를 교체 할수 있습니다.

오늘 설명하는 “LOGBack“은이중 하나의 “구현체” 입니다. 그래서 과연
어떤 이점이 있는지 quick 하게 둘러보고자 합니다.

해당 내용은 (Reasons to prefer logback over log4j)의 자료를 참고 했습니다.

(1) Faster implementation

“LOGBack“은 새롭게 작성 한것이 아니라, 오랫동안 검증된 “LOG4J”의 아키텍쳐 기반으로
재작성 되었습니다.
특히 성능은 약 10배 정도 빠르게 개선을 했고, 또한 메모리 점유도 보다 적게 사용을 합니다.
역시 성능에 관련된 얘기 입니다.

(2) Extensive battery of tests

위에서 말씀 드렸듯 “새로운 오픈소스” 이지만 , 이미  “Log4j” 시절 부터 수년간 수 많은 광범위한 테스트
를 진행했고, 더욱더 많은 테스트의 반복 과정을 수행 했습니다.
“Log4j보다 훨씬 뛰어난 가장 큰 이유중 하나“라고 합니다.
그 만큼 “높은 쿼리티“에 대한 자신감을 엿볼수 있습니다.

(3) logback-classic speaks SLF4J natively

“LOGBack“은 크게 3가지 컴포넌트로 구성이 되어 있습니다.
“logback-core“는 말 그대로 핵심 코어 컴포넌트 입니다.
“logback-classic“은 “slf4j“에서 사용이 가능하도록 만든 플러그인 컴포넌트 입니다.
“logback-access“는 사용하는 어플리케이션이 “웹 어플리케이션“일 경우 빛을 바라는
컴포넌트 입니다.” HTTP 요청에 대한 강력한 디버깅 기능을 제공 합니다.”

(4) Extensive documentation

“오픈소스 선택“에 있어서 레퍼런스 메뉴얼은 상당히 중요한 포인트 입니다.
“LOGBack“은 지속적이면서, 상세한 메뉴얼을 제공 합니다.

(5) Configuration files in XML or Groovy

logging 설정에 대한 syntax는 기본적으로 “XML” 형태로 되어 있습니다.
또한 Groovy의 “syntax” 를 지원 합니다.

(6) Automatic reloading of configuration files

개인적으로 호감이 가는 기능중 하나 입니다. 일하는 도메인 마다 틀리겠지만
기본적으로 “운영 서버” 모드에서는 로그레벨을 “WARN” 또는 “ERROR” 입니다.

하지만 만약 운영중에 좀더 상세한 로그를 보기 원할 경우가 있습니다.
예를 들어서 “INFO” 레벨로 변경하는 경우 입니다.

“log4j” 같은 경우는 다음과 같이  “서버를 셧다운 -> 재설정 -> 서버 기동” 의
절차로 진행을 합니다. 즉, 핵심 포인트는 “서버를 재기동” 해야 한다는 것입니다.

이러한 매커니즘은 “내부 스캐닝하는 별도의 쓰레드“가 감지를 하기 때문 입니다.
하지만 이런 “스캐닝 쓰레드”는 메모리에 대한 점유율을 최소화 하며,
심지어 “100개의 쓰레드가 초당 백만 invocation“을 발생해도 시스템에
크게 무리를 주지 않는 다고 합니다.

주로 이런 기능은 “WAS에서 동장하는 웹 어플리케이션“에서 많이 사용이 될듯 합니다.

(7) Graceful recovery from I/O failures

“Log4j” 같은 경우  “JDBC” , “Socket“등 다양한 “Appender“를 지원 합니다.
특히. 대다수의 환경에서는 “File”에 제일 많이 로그를 저장 할 것입니다.

하지만 만약 “파일 서버가 일시적으로 장애가 발생 할경우” , “파일 서버가 복구 될때까지”
“어플리케이션을 중지 시켰다가” 다시 파일 서버가 복구되면, 그때 서버를 재기동 할것 입니다.
하지만 “LOGBack“은 “서버 중지 없이, 이전 시점부터 복구를 graceful “하게 지원을 합니다.

(8) Automatic removal of old log archives

대부분 환경에서는 “하나의 파일”에 기록하는 것이 아니고, “특정 시간” 또는 “특정 파일 사이즈”
로 “Rolling” 해서 “Archiving“을 할 것입니다.

하지만 “Archiving된 로그 파일“을 계속 유지하지 않고, 일정 기간 지나면
“서비스에  부담을 주지 않기 위해서” 파일을 삭제 할것 입니다.

이럴경우 “Crontab” 또는 다른 삭제 스케줄러를 설정 또는 개발을 할것입니다.
“LOGBack“은 “maxHistory“라는 설정 정보를 통해서 주기적으로 “Archive”
파일을 자동 삭제 합니다.
“maxHistory“의 값이 “12“일 경우, “12개월 이후 삭제 하라는” 뜻입니다.

(9) Automatic compression of archived log files

“Archived Log File“를 만들때 비동기적으로 롤링 할 동안
자동 압축을 실행 합니다. 심지어 파일 용량이 커도, 또한
이러한 압축 작업은 어플리케이션을 block 시키지 않습니다.

(10) Prudent mode

만약 하나의 서버에서 “다수의 JVM“이 기동중일 경우 “하나의 파일“에
로그를 수집하려고 할때 사용하는 기능 입니다.

즉, “Log Aggregation” 기능 입니다. 조금만 아이디어를 내면, 매우 유용하게
사용이 가능 합니다.
다만 서로 쓰레드간 writing 할때 경합이 생기기 때문에 대량의 데이터를 사용할때
는 다소 피해야 합니다.

그렇기 때문에 반드시 해당 옵션을 적용시 “LOGBack” 메뉴얼을 참고 하시기 바랍니다.

(11) Lilith

“Lilith“은 “현재 발생하는 로그 이벤트에 대한 상태 정보를 볼수 있도록 지원 하는
뷰어” 입니다.
“log4j“를 지원하는 “chainsaw” 와 비슷한 기능을 합니다. 다만 차이점은 “Lilith”
“Large data“를 지원 합니다.

(12) Conditional processing of configuration files

빌드를 해본 사람이라면 아실듯 합니다. 빌드시 제일 골치가 아픈 것이 “config” 정보 와
“log file path” 입니다.
이유는 어플리케이션이 구동하는 환경이 “로컬, staging, cbt” 마다 틀리기 때문 입니다.
이런점을 해결 하기 위해서 “Maven Filter” 기능을 사용 하거나,  “JVM -D환경변수“를
통해서 각 환경 마다 선택적으로 “log 설정파일“을 선택하도록 구성을 할 것입니다.

“LOGBack“은 이런 이슈를 좀더 “Graceful“하게 지원을 합니다.
“JSTL” 같이 분기 스크립트 (<if>, <then> and <else>)를 제공해서 하나의 파일
에서 다양한 빌드 환경을 제공 하도록 지원을 합니다.

(13) Filters

“Filter” 기능은 “Log4j“에서 지원하는 기능입니다. 주 기능은 “로깅을 남길지 , 말지를”
핸드링 할수 있는 기능 입니다.
좀더 이해를 돕기 위해서 “UseCase“를 설명 드리겠습니다.

만약 “A“라는 사용자에게 비즈니스적으로 문제점이 발견이 되었습니다.
이럴경우는 “logical exception“이기 때문에 원인을 잡기가 쉽지가 않습니다.
또한 현재 “운영 서버“의 “Log LEVEL“이 “ERROR“일 경우 로그를 확인 할수가 없을
것입니다.
더우기 “운영 서버 logical exception“은 “staging” 환경과 데이터가 틀리기 때문에
실제 운영 로그를 확인하지 않고서는 재현을 할수가 없습니다.

그래서 “운영 서버의 로그 레벨“을   “DEBUG“로 수정합니다. 하지만 로그는 보이지만 전체 사용자가
해당이 되기 때문에 로그 데이터를 분석하기가 어렵습니다.
이럴 경우 “Filter“를 사용해서 “다른 사용자“는 “ERROR” 레벨을 유지하고,
“A” 사용자만 “DEBUG“로 설정을 하면, 분석하는데 많은 도움을 받을 수 있습니다.

(14) SiftingAppender

“SiftingAppender“는 “Filter“의 기능과 유사하면서 다른 기능을 제공 합니다.
“로그 파일을 특정 주제별로 분류“를 할 수 있도록 합니다.
예를 들어서 “HTTP Session“별로 로그 파일을 저장한다거나, “사용자별“로 별도의 로그파일을
저장 할 수 있습니다.

(15) Stack traces with packaging data

자바 어플리케이션에서 “Exception“이 발생을 하면 “Stack Trace“를 출력을 합니다.
자바는 “Exception” 정의가 잘되어 있어서 쉽게 “디버깅“을 할 수 있습니다.

하지만 제일 디버깅이 힘든 것중 하나가 “라이브러리에 의한 Exception” 입니다.
이럴 경우 “LOGBack“은 Exception 발생시 참조 했던 외부 라이브러리 버전을
출력하게 해줍니다.

(16) Logback-access, i.e. HTTP-access logging with brains, is an integral part of logback

위에서 언급했듯이 “logback-access“는 “웹 어플리케이션” 사용시 유용한 툴로써 제공 됩니다.
특히나 요새는 전통적인 “HTML” 출력이 아닌 “REST 서버“로써의 역할을 많이 합니다.
이럴 경우 “HTTP 디버깅“을 제공 합니다.

Conclusion

지금 까지 간략하게 “LOGBack” 기능을 살펴 봤습니다.
이외에 유용하고, 멋진 기능들이 많이 있습니다.

“logging“의 중요함은 지나치게 말씀을 드려도 지나치지 않습니다.
특히나 “클라우드 빅데이터” 시대에서 “logger“는 바로 최초 시작점 입니다.

제일 궁금했던 것이 “log4j를 만든 사람이 왜 ? logback를 만들었을까?” 입니다.

개인적 생각은 “log4j“를 “하위 호환성을 유지하면서 큰 리팩토링을 하기에는 다소 부담감”
과 “상용 버전을 위한 비즈니스적 관점“이 아닐까 조심 스럽게 말씀 드리고 싶습니다.

“LOGBack“의 큰 매력은 “Log4J 와 상당히 친숙함” 일것입니다. 이말은 그 만큼 사용하는데
있어서 낯설지 않다는 얘기 입니다.
심지어 “log4j.properties“를 “logback.xml” 설정 파일로 변환하는 “웹 변환기“도 제공 합니다.



또한 “SLF4J“를 지원하기 때문에 마음에 들지 않으면 “언제든지 다른 로거로 swiching“이 가능 합니다.

*reference

  • https://beyondj2ee.wordpress.com/2012/11/09/logback-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-reasons-to-prefer-logback-over-log4j/ (logback을 사용해야하는 이유 )
  • https://beyondj2ee.wordpress.com/2013/11/05/log4j%EC%97%90%EC%84%9C-logback%EC%9C%BC%EB%A1%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EA%B8%B0-migrate-from-log4j-to-logback/ (logback으로 마이그레이션 하기 )
Share: