2017년 12월 9일 토요일

mysqldump를 이용한 데이터 이관시 속도 개선 방법

1. mysql 에서 아래 옵션을 변경

myisam_sort_buffer_size = 1000M
myisam_max_sort_file_size = 12G
스토레지 엔진을 myisam으로 변경한 다음 insert 완료후

alter database **** engine=innodb

2. innodb_flush_log_at_trx_commit 설정 값 변경

innodb_flush_log_at_trx_commit 값이 1인경우 insert 할때 로그파일을 기록한다. 이로인해 초당 몇천건 정도 insert할 내용을 몇십건 정도 insert한다.

show variables like 'innodb_flush_log_at_trx_commit';
DB dump파일을 import 할때는 로그가 요 없으므로 0 으로 설정하고 변경 값 확인후 insert한 다음 추후 설정값을 다시 복구한다.

set global innodb_flush_log_at_trx_commit=0;

3. table 별로 백업 sql 만들기

db_root_pw='비밀번호'

db_list=`echo "show databases;" | mysql -N -uroot -p"$db_root_pw"`
 for db in $db_list ;do
  table_list=`echo "show tables" | mysql -N -uroot -p"$db_root_pw" $db`
  for table in $table_list ; do
    mysqldump -uroot -p"$db_root_pw" $db $table > $db.${table}.sql
  done
 done

4. 옵션을 통해 시간 줄이기

--no-autocommit=1 : autocommit을 끄고 개의 테이블 입력 완료후 commit 수행, 오류 발생시 다시 처음부터 시작함

--single-transaction=1 : 작업 후에 변경 된 데이터의 내역을 다시 적용하지 않는다.

--extended-insert=1 :  INSERT 구문이 늘어나는 것을 막아준다.

- export 할때

mysqldump -hHOST_NAME -uMY_ID -pMY_PASSWORD --databases DB_NAME --tables TABLES_OF_DB_NAME --no-autocommit=1 --single-transaction=1 --extended-insert=1 > DUMP.sql
- import 할때

mysql -hHOST_NAME -uMY_ID -pMY_PASSWORD --database DB_NAME < DUMP.sql 

5. txt 파일이용하기

- export 할때
mysqldump DATABASE_NAME > DUMP.txt
- import 할때

mysql -u username -p –database=DATABASE_NAME < DUMP.txt

6. large dump

mysql -h localhost -uroot -pPASSWORD
set global net_buffer_length=1000000;
set global max_allowed_packet=1000000000;
SET foreign_key_checks = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
source /media/dbdump.sql
완료후
SET foreign_key_checks = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;

7. 기타

my.cnf 위치찾기
mysql --verbose --help | grep -A 1 'Default options'
/etc/my.cnf 파일에서
innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0
설정 후 와 데이터 입력후 2번 실행
service mysql restart 

키워드 : mysql big data fast import

*reference

Share:

2017년 11월 2일 목요일

eclipse Bitbucket 연동

1. https://bitbucket.org/ 에서 계정을 만든다.

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

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


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


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

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

7. push를 할때 [rejected] master -> master (non-fast forward)  오류가 나오면 pull을 실행하고 다시 push 한다.

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

2017년 10월 9일 월요일

Spring에서 REST API PUT 데이터 안넘어갈때 처리법

web.xml파일을 열어서 추가한다.

<filter>
  <filter-name>HttpPutFormContentFilter</filter-name>
  <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>HttpPutFormContentFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
참고 : https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc
Share:

2017년 10월 8일 일요일

2017년 7월 20일 목요일

2017년 7월 18일 화요일

Linux에서 FTP 업로드 mysql 설치

1. MySQL 다운로드 

https://dev.mysql.com/downloads/mysql/

2. 다운받은 파일 /usr/local/src에 FTP 업로드

3. 압축 해제

tar zxvf ./mysql-5.1.73.tar.gz

4. mysql 계정생성

groupadd mysql
useradd -g mysql -s /bin/bash -d /home/mysql mysql

5. 컴파일 및 make, make install

5.1 컴파일 설정
cd /usr/local/src/mysql-5.1.73
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql --with-innodb --localstatedir=/usr/local/mysql/data
※ 컴파일 옵션 설명
--prefix=/usr/local/mysql : install 위치
--with-charset=utf8 : 기본 캐릭터셋
--with-extra-charsets=all
--with-mysqld-user=mysql : 유저명
--localstatedir=/usr/local/mysql/data : 데이터베이스의 데이터를 저장할 디렉토리를 설정

5.2 컴파일이 오류없이 정상적으로 되었다면 make, make install 입력
make
make install

6. DB설정


/usr/local/mysql/bin/mysql_install_db --user=mysql
vi /etc/profile
6.1 insert 버튼 누른후 제일 하단에 내용 추가후 esc 누르고 wq(저장하고종료) 입력

export PATH=$PATH:/usr/local/mysql/bin
6.2 mysql 환경설정 기본 파일 복사

cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
mkdir -p /usr/local/mysql/data //data폴더 없을시 생성
mysql:mysql /usr/local/mysql/data

7. 서버 부팅시 mysql 자동실행

cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/
cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysql
chkconfig --level 3 mysql on
chkconfig --level 5 mysql on
chmod 755 /usr/local/mysql

8. DB 시작

service mysql start //시작
service mysql stop  //종료

9. mysql root 패스워드 변경

mysql -p mysql
//Enter password: 엔터
update user set password=password('패스워드') where user='root';
flush privileges;
quit

10. 3306번 보트 방화벽 권한 설정

iptables -I INPUT 1 -p tcp --dport 3306 -j ACCEPT
service iptables save //방화벽 규칙을 저장
vi /etc/sysconfig/iptables //상단에 추가되었는지 확인
service iptables restart //재시작

11. 접근권한이 없을시 ( Host 'HOST이름' is not allowed to connect to this MySQL server )

mysql -p mysql
GRANT ALL PRIVILEGES ON *.* TO root@'아이피' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;
flush privileges; 
quit
Share:

linux에서 FTP업로드 Tomcat 설치

1. Tomcat tar파일 다운로드  

https://tomcat.apache.org/

2. /usr/local 폴더에 FTP업로드후 압축해제

tar -xvzf apache-tomcat-6.0.53.tar.gz

3. Classpath 설정

vi /etc/profile
3.1 맨아래에 다음 내용 추가

export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
//작성 방법 insert 버튼 -> 내용 작성 -> shift + : -> wq(저장후종료) 입력  
3.2 Classpath 수정내용 적용

source /etc/profile

4. 링크걸기

ln -s /usr/local/apache-tomcat-6.0.53 /usr/local/tomcat

5. 클래스 패스 적용여부 확인

cd $CATALINA_HOME/bin

6. 톰캣재시작


startup.sh //시작
shutdown.sh //종료

7. 접속

localhost:8080
Share:

WAR TOMCAT에 배포하기

1. WAR 파일 만들기

export 하여 war 파일을 만든다.

2. Tomcat webapps 폴더에 FTP접속해서 war 파일을 올린다.

3. Tomcat 재시작

cd /usr/local/tomcat/bin
shutdown.sh
startup.sh

4. Tomcat 실시간 log 보기


tail -f /usr/local/tomcat/logs/catalina.out

Share:

linux에서 mysql 파일 실행하고 접근하는 방법

1. FTP업로드후 경로로 이동후 sql 파일 실행


cd /usr/local/mysql/bin

./mysql -u root -p mysql > ./파일명.sql

2. Table 'mysql.tableName' doesn't exist error 시 mysql 접속후 데이터베이스 변경

./mysql -u root -p mysql 접속

use DB명

source 파일명.sql

3. 작업환경에서 ERROR : com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'DATABASENAME.TableName' doesn't exist


//모든 원격지에서 접속 권한 추가
grant all privileges on DB명.* to 유저아이디@'%' identified by '비밀번호';
flush privileges;

//권한확인
SHOW GRANTS FOR root@'%'

4. TABLE 대문자로 쿼리사용시 EROOR날때

vi /etc/my.cnf
[mysqld] 아래에 lower_case_table_names=1을 insert 버튼눌러서 추가 하고 esc 누르고 !wq로 저장
[mysqld] lower_case_table_names = 1

//mysql재시작
sudo service mysql restart
Share:

2017년 7월 17일 월요일

linux에서 FTP업로드 jdk 설치

1. jdk 다운로드

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 접속하여 버전에 맞는 버전을 다운로드한다.

2. 기존 jdk 여부 확인후 설치

2.1 jdk 설치여부 확인

java -version 
2.2 기존버전이 있을시 리스트 확인후 기존 자바 제거

rpm -qa | grep java //리스트확인
2.3 jdk 제거

yum remove java-1.7.0-openjdk-1.7.0.99-2.6.5.1.el6.x86_64  
yum remove java-1.6.0-openjdk-1.6.0.38-1.13.10.4.el6.x86_64

3. 폴더만들고 FTP업로드

3.1 폴더만들기

sudo mkdir -p /usr/local/java
3.2 FTP에 파일 업로드후 권한설정

chmod 755 ./jdk-7u80-linux-x64.tar.gz
3.3 설치 후 확인

cd /usr/local/java
tar zxvf ./mysql-5.1.73.tar.gz

4. profile 파일 수정

4.1 profile을 편집한다.

vi /etc/profile
4.2 profile 파일 최하단에 붙여넣는다.

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
// 작성 방법은 insert버튼 -> 내용 작성후 esc -> shift + : -> wq -> 엔터

5. java 기본 명령어 등록

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.7.0_80/bin/java" 1;
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.7.0_80/bin/javac" 1;
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.7.0_80/bin/javaws" 1;
sudo update-alternatives --set java /usr/local/java/jdk1.7.0_80/bin/java;
sudo update-alternatives --set javac /usr/local/java/jdk1.7.0_80/bin/javac;
sudo update-alternatives --set javaws /usr/local/java/jdk1.7.0_80/bin/javaws;

6. 변경사항 적용

source /etc/profile

7. 자바 버전 확인

java -version

Share:

2017년 7월 13일 목요일

Atom Editor 설치 플러그인 목록

1. minimap (https://atom.io/packages/minimap)

오른쪽 상단에 소스코드 전체의 맵이 보인다.
설정에서 absolute-mode를 활성화 킬것.

2. Remote-FTP (https://atom.io/packages/remote-ftp)

FTP 연결

3. Atom-autocomplete-php (https://atom.io/packages/atom-autocomplete-php)

PHP 코드 자동완성 기능

4. emmet (https://atom.io/packages/emmet) 

HTML , CSS 자동 완성기능
ex) *5를 입력하여 5개 코드를 입력하거나 !html 를 입력하면 html코드 입력폼이 나타난다.

5. atom-beautify (https://atom.io/packages/atom-beautify) 

소스코드에서 정렬되지 않은 코드를 정렬해준다.
사용은 우클릭 - Debug Atom Beautify

6. tool-bar (https://atom.io/packages/tool-bar) 

툴바의 아이콘 중 파일들을 구분이 쉽도록 파일의 특징을 나타낸 아이콘으로 보여준다.

7. highlight-line (https://atom.io/packages/highlight-line) 

현재 자신이 선택한 코드의 행을 밝게 해준다.

8. Auto close HTML  

자동으로 닫는 태그를 만들어준다.

9. sublime-style-column-selection

세로 드래그가 가능하다.

10. atom-bootstrap3

자동으로 부트스트랩 태그를 만들어준다

11. sync-settings

Atom 셋팅을 동기화해준다.

12. markdown-format

13. markdown-preview-enganced

14. atom-live-server

실시간 소스보기

15. Genesis-ui Theme

어두운 색감에 현재 파일과 탭만 밝게 표시
Share:

Atom Editor 에서 AWS SFTP 연결

1. FTP 설치

file -> setting -> Packages 에서 Remote-FTP 입력후 install한다.

2. Remote-FTP 설정 

local에서 폴더를 열고 Packages -> Remote-FTP -> Create SFTP confile file 을 클릭한다.
( 단축키 ctrl + shift + p)


{
    "protocol": "sftp",
    "host": "aws서버",
    "port": 22,
    "user": "ec2-user", //linux 일때 ec2-user ,ubuntu는 ubuntu
    "pass": "pass",
    "promptForPass": false,
    "remote": "/var/www/html",
    "agent": "",
    "privatekey": "C:\\폴더명\\폴더명\\키파일명", //키경로
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "watch": [],
    "watchTimeout": 500
}
Share:

AWS Linux Apache 설치

1. shell에서 서버에 접속해 yum install httpd 입력하여 설치

2. 설치 완료후 service httpd start 입력해 서버를 실행한다
   - 종료는 service httpd stop

3. 브라우저를 실행하여 주소값 입력하여 실행 확인

4. chkconfig --list httpd 로 부팅상태를 확인하고 chkconfig --httpd on 을 입력한다.
* chkconfig : 리눅스서버가 부팅될 때 실행될 프로그램을 설정하는 역활을 하는 유틸리티

5. 디렉토리 변경을 원하면 /etc/httpd/conf 디렉토리에서 httpd.conf 파일을 vi 편집기로
   열고 DocumentRoot 부분을 설정하고 서버를 재시작한다.

6. 작업중 FTP 권한에러시 chmode 777 폴더명을 입력한다.
Share:

2017년 7월 7일 금요일

Intellij setting

1. maven

Name : install
Command line : clean install

Name : build
Command line : clean package

2. tomcat

tomcat 경로 설정하고 war exploded 추가한다.
Share:

2017년 6월 22일 목요일

spring 다국어 설정

1. context-common.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:jdbc="http://www.springframework.org/schema/jdbc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
 <!-- CookieLocaleResolver : 쿠키를 이용한 locale정보 사용 
      SessionLocaleResolver : 세션을 이용한 locale정보 사용 
      AcceptHeaderLocaleResolver : 클라이언트의 브라우져에 설정된 locale정보 사용 
       Bean 설정 파일에 정의하지 않을 경우 AcceptHeaderLocaleResolver 를 default 로 적용된다. -->
 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
 <!-- 사용자의 브라우져의 Locale 정보를 이용하지 않고 사용자가 선택하여 언어를 직접 선택할 수 있도록 구현하려 한다면 
      CookieLocaleResolver 나 SessionLocaleResolver 를 이용한다.
                     먼저 다국어를 지원해야 하므로 메세지를 MessageSource 로 추출하여 구현해야 한다. -->
 <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="basenames">
   <list>
    <value>classpath:/egovframework/message/message-common</value> <!-- 파일경로 -->
   </list>
  </property>
  <property name="cacheSeconds">
   <value>60</value>
  </property>
 </bean>
    
</beans>

2. dispatcher-servlet.xml 수정

<mvc:interceptors>  
 <mvc:interceptor>
  <mvc:mapping path="/**" />
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
   <property name="paramName" value="lang" />
  </bean>
 </mvc:interceptor>
</mvc:interceptors>

3. Web 을 통해 들어오는 요청을 Charset UTF-8 적용한다. CharacterEncodingFilter 을 이용하여 encoding 할 수 이도록 아래와 같이 세팅한다


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">
 <display-name>dev</display-name>
    
 <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>/*</url-pattern>
 </filter-mapping>
    
 <filter>
  <filter-name>HTMLTagFilter</filter-name>
  <filter-class>egovframework.rte.ptl.mvc.filter.HTMLTagFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>HTMLTagFilter</filter-name>
  <url-pattern>*.do</url-pattern>
 </filter-mapping>
    
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:egovframework/spring/context-*.xml</param-value>
 </context-param>
    
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
    
 <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/springmvc/dispatcher-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>
    
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
    
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
    
 <error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/common/error.jsp</location>
 </error-page>
 <error-page>
  <error-code>404</error-code>
  <location>/common/error.jsp</location>
 </error-page>
 <error-page>
  <error-code>500</error-code>
  <location>/common/error.jsp</location>
 </error-page>
    
</web-app>

4. properties 파일 추가 


각 파일에 key value 값으로 작성한다
ex) button.search=Search

5. jsp에서 spring태그를 이용해서 사용한다.


<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:message code="board.subject"/>

6. 다국어 설정 되었는지 테스트 

ex) http://localhost:8080/list.do?lang=ko / http://localhost:8080/list.do?lang=en
Share:

spring log4j2 설정

1. pom.xml 추가

<dependency>
 <groupId>org.bgee.log4jdbc-log4j2</groupId>
 <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
 <version>1.16</version>
</dependency>

2. dataSource 수정


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
    <property name="url" value="jdbc:log4jdbc:mysql:thin:@123.456.789.12:1521:test" />
    <property name="username" value="test"/>
    <property name="password" value="123"/>
</bean>

3. log4j2.xml 수정


<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <!-- Console 출력을 위한 Appender -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="java.sql" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="dailyRollingFileAppender" />
        </Logger>
        <Logger name="egovframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="dailyRollingFileAppender" />
        </Logger>
  <!-- log SQL with timing information, post execution -->
        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="dailyRollingFileAppender" />
        </Logger>
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="dailyRollingFileAppender" />
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="console" />
            <AppenderRef ref="dailyRollingFileAppender" />
        </Root>
    </Loggers>
</Configuration>
Share:

2017년 6월 20일 화요일

2017년 6월 16일 금요일

context:component-scan vs context:annotation-config vs mvc:annotation-driven

1. context:component-scan

@Component 
@Repository 
@Service 
@Controller 
을 bean으로 등록하고
@Autowired 
@Qualifier
을 인식한다.

2. context:annotation-config

<!--RequiredAnnotationBeanPostProcessor @Required 사용시
         AutowiredAnnotationBeanPostProcessor @Autowired 사용시
         CommonAnnotationBeanPostProcessor @Resource, @PoastConstruct, @PreDestroy 사용시
         ConfigurationClassPostProcessor @Configuration 사용시  
         context를 명시하면 context태그 하나로 사용가능  
        <context:annotation-config/> -->

(context:component-scan 을 정의한 경우 Annotation 인식을 위한 설정 context:annotation-config 을 별도로 추가하지 않아도 됩니다.)

3. mvc:annotation-driven

- DefaultAnnotationHandlerMapping


가장 우선으로 적용되도록 @RequestMapping 을 이용한 핸들러 매핑 전략을 등록한다. 따라서 다른 디폴트 핸들러 매핑 전략은 자동 등록되지 않는다는 점을 기억해두자.


- AnnotationMethodHandlerAdapter


AnnotationMethodHandlerAdapter 는 DispatcherServlet 이 자동으로 등록해주는 디폴트 핸들러 어댑터다. 하지만 디폴트 설정을 변경하려면 빈으로 등록해야 한다. <mvc:annotation-driven> 은 기본적으로 이 AnnotationMethodHandlerAdapter 를 빈으로 등록한다. 따라서 <mvc:annotation-driven> 을 사용했을 때는 직접 AnnotationMethodHandlerAdapter 빈을 등록해서는 안된다. 또, 핸들러 어댑터 전략을 빈으로 등록했으므로 그 밖의 디폴트 핸들러 어댑터 전략은 자동등록되지 않는다.

- ConfigurableWebBindingInitializer


모든 컨트롤러 메소드에 자동으로 적용되는 WebDataBinder 초기화용 빈을 등록하고 AnnotationMethodHandlerAdapter 의 프로퍼티로 연결해 준다.

기본적으로 컨버전 서비스는 @NumberFormat 과 같은 애노테이션 방식의 포맷터를 지원하는 FormattingConversionServiceFactoryBean 이 등록된다.

글로벌 검증기는 LocalValidatorFactoryBean 으로 설정된다. 따라서 JSR-303 의 검증용 애노테이션 기능이 자동으로 제공된다. 단, 이 기능이 적용되려면 JSR-303 지원 라이브러리가 클래스패스에 등록되어 있어야 한다. JSR-303 라이브러리가 없다면 LocalValidatorFactoryBean 은 등록되지 않는다.

- 메시지 컨버터


AnnotationMethodHandlerAdapter 의 messageConverters 프로퍼티로 메시지 컨버터들이 등록된다. 네 개의 디폴트 메시지 컨버터와 함께 Jaxb2RootElementHttpMessageConverter 와 MappingJacksonHttpMessageConverter 가 추가로 등록된다. 단, 각각 JAXB2 와 Jackson 라이브러리가 클래스 패스에 존재하는 경우에만 등록된다.

- <spring:eval> 을 위한 컨버전 서비스 노출용 인터셉터


<spring:eval> 은 기본적으로 표준 컨버터를 이용해서 모델의 프로퍼티 값을 JSP 에 출력할 문자열로 변환한다. 하지만 <mvc:annotation-driven> 을 등록해 주면 <spring:eval> 에서 컨버전 서비스를 이용할 수 있다. ConfigurableWebBindingInitializer 에 등록되는 것과 동일한 컨버전 서비스를 인터셉터를 이용해서 <spring:eval> 태그에서 사용할 수 있도록 제공해주는 기능이 자동으로 추가된다. 이 덕분에 폼에 모델 정보를 출력할 때와 마찬가지로 스프링 컨버터나 포맷터의 강력한 오브젝트-스트링 타입변환 기능이 <spring:eval> 에 적용된다.

<mvc:annotation-driven> 이 자동으로 등록해주는 몇 가지 설정정보는 애트리뷰트를 이용해 바꿀 수 있다. 직접 만든 커스텀 검증기, 컨버전 서비스 등을 적용할 때는 다음과 같은 애트리뷰트를 사용해 등록해주면 된다.


- validator


자동 등록되는 ConfigurableWebBindingInitializer 의 validator 프로퍼티에 적용할 Validator 타입의 빈을 지정할 수 있다. 모든 컨테이너에 일괄 적용하는 검증기는 디폴트로 추가되는 JSR-303 방식의 LocalValidatorFactoryBean 이면 충분하다. 모델 단위의 검증기는 컨트롤러 레벨에서 직접 DI 받아서 사용하는 편이 낫기 때문이다. 하지만 LocalValidatorFactoryBean 을 확장하거나 재구성하려면 직접 빈으로 등록해줄 필요가 있다. 이때 validator 애트리뷰트를 이용해 다음과 같이 등록해 줘야 한다.

- conversion-service


ConfigurableWebBindingInitializer 의 conversionService 프로퍼티에 설정될 빈을 직접 지정할 수 있다. 스프링이 제공하는 컨버전 서비스만 사용한다면 디폴트로 등록되는 FormattingConversionServiceFactoryBean 으로 충분하겠지만, 직접 개발한 컨버터나 포맷터를 적용하려면 FormattingConversionServiceFactoryBean 을 빈으로 직접 등록하고 재구성해줘야 한다. 이때는 conversion-service 애트리뷰트를 이용해 다음과 같이 설정해주면 된다.


<mvc:annotation-driven> 은 매우 빠르고 간편하게 @MVC 의 주요 빈을 설정하고 최신 기능을 사용하게 해준다. 하지만 검증기와 컨버전 서비스를 제외하면 기본적으로 등록되는 빈의 설정을 변경할 수 없다. AnnotationMethodHandlerAdapter 와 DefaultAnnotationHandlerMapping 등의 설정을 변경해야할 때는 <mvc:annotation-driven> 을 사용할 수 없다. 이때는 직접 필요한 빈을 등록하고 프로퍼티를 통해 설정해줘야 한다.

*출처 : http://springsource.tistory.com/90

Share:

2017년 5월 21일 일요일

github 특정 파일 commit 삭제하기

- 원하는 파일명의 전체경로및 파일명을 입력한다.


git filter-branch --tree-filter 'rm -rf 파일전체경로및파일명' HEAD


정상실행여부 확인

- 빈 커밋 제거가 필요할시


git filter-branch --prune-empty HEAD


- 상태 확인
git status


-커밋

git push origin master --force
Share:

2017년 5월 20일 토요일

aws Ubuntu tomcat 설치

- Tomcat 8 설치

apt-get install tomcat8


- 작동여부 확인
http://서버ip:8080

- 접속 안될시 8080포트 확인
Security Groups의 Inbound 규칙에 8080 포트 번호를 추가
Share:

2017년 5월 11일 목요일

mysql 특정 db 권한 주기

1. mysql  접속

2. 사용자 확인

use mysql;
select user, host from user;

3. db 만들기

create database DB명;

4. user 생성

user 생성
insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject)
 values ('localhost','사용자명',password('비밀번호'),'','','');
외부접근은 host 를 % 로 변경

변경사항 적용
flush privileges;

5. 특정 db 권한주기

grant all privileges on DB명.* to 사용자명@호스트 identified by '비밀번호';

6. 권한 확인

SHOW GRANTS FOR 사용자명;


Share:

2017년 3월 26일 일요일

링크모음

▶ 뉴스

  - 아이티클 : http://www.itcle.com
  - IT월드 : http://www.itworld.co.kr
  - 베타뉴스 : http://www.betanews.net
  - 지디넷 : http://www.zdnet.co.kr
  - 전자신문 : http://www.etnews.com
  - 블로터닷넷 : http://www.bloter.net
  - CIO코리아 : http://www.ciokorea.com
  - 플래텀 : http://platum.kr
  - 생각노트 : http://insidestory.kr
  - 슬로우뉴스 : http://slownews.kr
  - 테크니들 : http://techneedle.com
  - 아웃스탠딩 : http://outstanding.kr
  - 뉴스페퍼민트 : http://newspeppermint.com
  - 모비인사이드 : http://www.mobiinside.com/kr/
  - 벤처스퀘어 : http://www.venturesquare.net
  - 브런치 : https://brunch.co.kr
  - ㅍㅍㅅㅅ : http://ppss.kr
  - CLO : http://clomag.co.kr



▶ 블로그

  - 란즈크 : http://blog.naver.com/yeux1122
  - 감마 : http://gamma0burst.tistory.com
  - 꽃잔 : http://www.gamsungit.com
  - 신제갈량 : http://jegalcsh.blog.me
  - 씨디맨 : http://www.cdmanii.com
  - 엔돌슨 : http://www.ndolson.com
  - 광파리 : http://kwang82.hankyung.com
  - 함영민 : http://www.dicagallery.com
  - 서명덕 : http://www.itviewpoint.com
  - 이지이 : http://www.272it.com
  - Liverex : http://liverex.tistory.com
  - T.B. : http://ryueyes11.tistory.com
  - 엑시노아 : http://blog.eairship.kr



▶ IT 커뮤니티

  - 클리앙 : http://www.clien.net
  - 시코 : http://www.seeko.co.kr
  - 루리웹 : http://www.ruliweb.com
  - 파코즈 : http://www.parkoz.com
  - 쿨앤조이 : http://www.coolenjoy.net
  - 플레이웨어즈 : http://playwares.com
  - 하드웨어배틀 : http://www.hwbattle.com
  - 기글하드웨어 : https://gigglehd.com/gg/
  - 언더케이지 : http://www.underkg.co.kr
  - 데브피아 : http://www.devpia.com
  - 쉐어드아이티 : http://www.sharedit.co.kr
  - KLDP : https://kldp.org
  - DNA개발자네트워크 : http://dna.daum.net/lens/
  - OKKY : http://okky.kr
  - SQLer : http://www.sqler.com
  - Reddit : https://www.reddit.com



▶ 사진

  - 팝코넷 : http://www.popco.net
  - CULTPD : http://cultpd.tistory.com
  - SLR : http://www.slrclub.com



▶ 쇼핑

  - 다나와 : http://www.danawa.com
  - 에누리 : http://www.enuri.com
  - 딜바다 : http://www.dealbada.com
  - 뽐뿌 : http://www.ppomppu.co.kr
  - 중고나라 : http://cafe.naver.com/joonggonara



▶ 취업 / 채용

  1) 정부

    - 워크넷 : http://www.work.go.kr
    - 나라일터 : http://www.gojobs.go.kr
    - 알리오 : http://www.alio.go.kr
    - 커리어넷 : http://www.career.go.kr
    - 공무원되기 : http://injae.go.kr/



  2) 민간

    - 잡코리아 : http://www.jobkorea.co.kr
    - 사람인 : http://www.saramin.co.kr
    - 인크루트 : http://www.incruit.com
    - 잡플래닛 : http://www.jobplanet.co.kr
    - 크레딧잡 : http://www.kreditjob.com



  3) 커뮤니티

    - 취업뽀개기 : http://cafe.daum.net/breakjob
    - 공준모 : http://cafe.naver.com/studentstudyhard
    - 독취사 : http://cafe.naver.com/dokchi
    - 스펙업 : http://cafe.naver.com/specup



▶ HTML

   - Masonry : http://masonry.desandro.com/layout.html
   - HTML5UP : https://html5up.net
   - W3 School : http://www.w3schools.com
   - CSS Reference : http://cssreference.io
   - 코드프로젝트 : https://www.codeproject.com
   - 코딩 문제풀이 : https://www.codewars.com
   - Baekjoon(알고리즘 문제풀이) : https://www.acmicpc.net
   - 부트스트랩 : http://getbootstrap.com
   - 부트스트랩 테마 : http://www.prepbootstrap.com



▶ 형상관리, 협업

   - Github : https://github.com
   - SVN : https://tortoisesvn.net/, https://subversion.apache.org
   - CVS : http://savannah.nongnu.org/projects/cvs
   - Redmine : http://www.redmine.or.kr
   - JIRA : https://www.atlassian.com/software/jira
   - Mantis : http://www.mantisbt.org
   - Trac : http://trac.edgewall.org



▶ IT 강의

   - 데브렉 : http://www.devlec.com
   - 모든에듀 : http://www.modenedu.com
   - 생활코딩 : http://opentutorials.org
   - 닷넷코리아 : http://www.dotnetkorea.com
   - 훈스닷넷 : http://www.hoons.net
   - 태요넷 : http://www.taeyo.pe.kr
   - 인프런 : http://www.inflearn.com
   - 스노우 : http://www.snow.or.kr
   - TED : http://www.ted.com



▶ 데이터베이스

   - 오라클클럽 : http://www.gurubee.net
   - DB사랑넷 : http://database.sarang.net
   - DB 가이드 : http://www.dbguide.net



▶ PHP

   - APMSetup : http://dev.naver.com/projects/apmsetup/
   - PHPSchool : http://phpschool.com
   - 코드이그나이터 : http://www.codeigniter-kr.org
   - 라라벨 : https://laravel.co.kr
   - 워드프레스 : https://ko.wordpress.org
   - 제로보드(XE) : https://www.xpressengine.com
   - 그누보드 : http://sir.kr
   - 텍스트큐브(태터툴즈) : http://www.textcube.org



▶ 프로그래밍

   - 예제(파이썬) : http://pythonstudy.xyz
   - Git 강의 : http://backlogtool.com/git-guide/kr/
   - 코드라이언(루비) : http://codelion.net
   - 코드아카데미(파이썬) : https://www.codecademy.com/ko/tracks/python-ko
   - 남궁성 코드스터디(자바) : http://cafe.naver.com/javachobostudy
   - 스택오버플로우 : http://stackoverflow.com
   - XDA 디벨로퍼 : https://www.xda-developers.com



▶ 스마트폰

   - 맛클 : http://www.matcl.com
   - 세티즌 : http://www.cetizen.com
   - 더어플 : http://www.theappl.com
   - 디벨로이드 : http://cafe.naver.com/develoid
   - 안드로이드펍 : http://www.androidpub.com
   - 안드로이드사이드 : http://www.androidside.com
   - 아사모 : http://cafe.naver.com/appleiphone
   - 맥쓰사 : http://cafe.naver.com/inmacbook
   - 링크,용어 : http://www.ppomppu.co.kr/zboard/view.php?id=phone&no=2918526



▶ 가상화 솔루션

   - Virtual PC : https://www.microsoft.com/ko-kr/download/details.aspx?id=3702
   - Virtual BOX : https://www.virtualbox.org
   - VMware : http://www.vmware.com/kr.html
   - Paralles : http://www.parallels.com/kr/



▶ 영상 편집

   - 소니 베가스 : http://www.sonycreativesoftware.com
   - 어도비 프리미어 : http://www.adobe.com/kr/products/premiere.html

▶ 자료공유

   - 리드트렌드 : http://readtrend.com
   - 네이버 D2 : http://d2.naver.com/home
   - 네이버 개발자센터 : https://developers.naver.com/main
   - 티몬의 개발이야기 : http://tmondev.blog.me/
   - 넥슨 NDC : https://ndc.nexon.com/main
   - SK플래닛 기술블로그 : http://readme.skplanet.com
   - 카카오 기술블로그 : http://tech.kakao.com
   - 비트윈 기술블로그 : http://engineering.vcnc.co.kr
   - 나는프로그래머다 : https://www.facebook.com/iamprogrammer.io/
   - 전자문제집 : http://www.comcbt.com
   - 위키독스 : https://wikidocs.net



▶ 사전

   - 위키피디아 : http://ko.wikipedia.org
   - 나무위키(리그베다) : http://namu.wkiki
   - 미디어위키 : http://www.mediawiki.org
   - 디씨위키 : http://wiki.dcinside.com/wiki/
   - 네이버 지식백과 : http://terms.naver.com
   - 두피디아(두산백과) : http://www.doopedia.co.kr
   - 브래태니커(한국) : http://premium.britannica.co.kr



▶ 단축 주소

   - 구글 : http://goo.gl
   - Bitly : http://bit.ly
   - Owly : http://ow.ly
   - Tinyurl : http://tinyurl.com
   - 3.ly : http://www.3.ly
   - sm1 : http://sm1.kr
   - ze.am : http://ze.am
   - 원링크 확인 : http://www.checkshorturl.com, http://untiny.com



▶ 사진 업로드

   - 구글포토 : https://photos.google.com
   - 플리커 : https://www.flickr.com
   - 스머그머그 : http://www.smugmug.com
   - 500px : https://500px.com
   - Imgur : http://imgur.com
   - Gfycat : https://giant.gfycat.com/
   - PostImage https://postimage.org/
   - Tinypic : http://tinypic.com



▶ 토렌트

   - 유토렌트 : http://www.utorrent.com/intl/ko/
   - 이토렌트 : http://www.etorrent.co.kr
     (http://www.torrentfile.co.kr, http://www.torrentfile.kr,
      http://www.tvcafe.co.kr, http://www.etobang.com)
   - 비트스눕 : https://bitsnoop.com
   - 토렌트킴 : https://torrentkim5.net
   - 토렌트걸 : https://torrentgirl.org
   - 토렌트위즈 : https://torrentwiz.net

▶ 기타

   - KOSA(소프트웨어기술자 경력관리시스템) : https://career.sw.or.kr
   - 한국정보과학회 : http://www.kiise.or.kr
   - 한국전자전 : http://www.kes.org/kor/
   - 소프트웨어공제조합 : http://www.ksfc.or.kr
   - 방송통신위원회 : http://www.kcc.go.kr
   - 온오프믹스(모임) : http://www.onoffmix.com
   - 기업정보공시 : http://dart.fss.or.kr
   - 체불사업주 공개 : http://www.moel.go.kr/view.jsp?cate=3&sec=12



출처: http://scriptkiddie.tistory.com/3
Share:

2017년 3월 24일 금요일

2017년 3월 22일 수요일

Spring properties 설정하기

1. beans에 스키마를 추가한다.

2개를 추가한다.

http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd

최종 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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/util
  http://www.springframework.org/schema/util/spring-util-4.0.xsd">

  <util:properties id="global" location="classpath:config/properties/global.properties" />  
    
</beans>

2. properties 파일에 설정을 추가한다.


dbPool.driverClassName=com.mysql.jdbc.Driver
dbPool.url=jdbc:mysql://주소:포트/데이터베이스명
dbPool.userName = 아이디
dbPool.password = 비밀번호

3. 사용하는 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="#{global['jdbc.driverClassName']}"/>
        <property name="url" value="#{global['jdbc.url']}"/>
        <property name="username" value="#{global['jdbc.userName']}"/>
        <property name="password" value="#{global['jdbc.password']}"/>
    </bean>
</beans>

스프링에서@Value("#{global['jdbc.username']}") 으로도 사용가능하다.
Share:

2017년 3월 15일 수요일

메이븐 컴파일 오류시 해결 방안

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK
로그가 찍히면

1. Window > Preferences > Installed JREs 로 들어가면 JDK경로로 되어있다.





2. jdk경로로 변경해준다.


3. 프로젝트에서 Mavan Install 후 Maven Update 한다.
Share:

2017년 3월 14일 화요일

Eclipse ini 및 최적화 설정

# 설정 공유
File > Export 에서 Preferences를 export하고 다른 워크스페이스에서 import.

1. 설정파일 수정

eclipse > eclipse.ini 파일을 수정하며, 아래 설정값을 자신의 사양에 맞춰 변경하여 사용한다. 세미콜론(;)은 주석이다.

; workspace의 경로를 윈도우 타이틀바에 출력
-showlocation

; 클래스 유효성 검사 생략, 그러나 나중에 어딘서 오류나는지 확인하기 위해 사용 추천
;-Xverify:none ; jdk 버전으로 설정하면 속도 향상
-Dosgi.requiredJavaVersion=1.6

;---------------------------------------------
; JVM 메모리 관리
;---------------------------------------------

;JVM 시작히 힙 영역 크기 : 최소(ms), 최대(mx)
-Xms64m
-Xmx1024m

;Permanent(영구) 영역 : JVM 클래스와 메소드를 위한 공간, 'Out of Memory' 에러 발생시 크기 조절 = PermSize
;New/Young 영역 : 새로 생성된 개체들을 위한 공간 = NewSize
; Old 영역 : 만들어진지 오래된 객체들의 공간(New영역에서 이동)
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:NewSize=128M
-XX:MaxNewSize=512M

; Heap Shrinkage를 수행하는 임계치를 지정한다. 예를 들어 이 값이 70이면 Heap의 Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다. 기본값 70
;-XX:MaxHeapFreeRatio=70

;---------------------------------------------
; Garbage Collection 방식에 따라 가능한 옵션
;---------------------------------------------
; 병렬 GC 사용
; 메모리가 충분하고 코어수 많을때 유리하다.
;-XX:+UseParallelGC

;CMS GC 사용 ; 응답속도가 중요할때 사용한다.
;GC Pause에 의한 사용자 응답시간 저하 현상을 줄인다.
-XX:-UseConcMarkSweepGC
;-XX:+CMSIncrementalPacing

; G1 GC(Garbage-First Garbage Collector) 사용
; 성능은 좋지만 더욱 안정화가 되었을때 사용하는 것이 좋다.
; JDK 1.7.0_4 이후 사용하는것이 안정적
;-XX:+UnlockExperimentalVMOptions
;-XX:+UseG1GC ;-XX:MaxGCPauseMillis=10

;---------------------------------------------

; out of space in codecache 오류 발생시 증가. 이 값은 permGenSpace 공간에 할당되므로 비례하게 커야한다.
-XX:ReservedCodeCacheSize=128m

; 컴파일러의 소수점 최적화 기능을 작동시켜 빨라진다.
-XX:+AggressiveOpts

;개별 Thread의 Stack Size를 지정
;대부분 기본값 사용, 어플리케이션의 스레드 스택에 의한 메모리 요구향이 높아지면 'Out Of Memory' 에러 발생
-Xss4m
-XX:+UseFastAccessorMethods
-XX:CompileThreshold=20000

2. 소스 자동 폴딩 해제

Preferences > Java > Editor > Folding 에서 Enable folding 해제
혹은 Coffee Bytes Java Folding 플러그인으로 기능 확장

3. 코드 자동완성기능 해제

(자동으로 실행되는 것을 해제하고, ctrl+space를 사용해서 동작시킬 수 있다.)
Preferences > Java > Editor > Content Assist 에서 Auto Activation - Enable auto activation 해제

4. 오른쪽 하단에 메모리 사용상태 표시

Preferences > General 에서 Show heap status 체크

5. Spell checking 해제

Preferences > General > Editors > Text Editors > Spelling 에서 Enable spell checking 해제

6. 인코딩 변경

Preferences > General > Workspace 에서 Text file encoding 는 UTF-8, New text file line delimite 값은 사용환경에 따라 변경

7. 줄번호 사용(이클립스 루나버전 이후로는 기본값으로 설정)

Perferences > General > Editors > Text Editors 에서 Show line numbers 체크

8. 이클립스 실행속도 개선

실행할때 로딩되는 플러그인을 제외한다.
Preferences > General > Startup and Shutdown 에서 필요없는 것 제외

9. Validation 유효성체크 해제

자신이 사용할 부분만 켜서 사용한다.
Preferences > Validation

10. 불필요한 플러그인 삭제

1) Preferences > Install/Update 에서 Uninstall or update 선택
2) 불필요한 것 Uninstall

11. Autometic Update Off

Preferences > Install/Updates > Automatic Updates 에서 체크해제

참고링크 : https://slipp.net/wiki/pages/viewpage.action?pageId=5177633
Share:

2017년 3월 12일 일요일

Spring 에 대한 간단한 메모

- HttpSession 을 파라미터로 가질 경우 세션이 생성된다. 기존에 세션이 존재한다면 해당 세션이 전달되고 그렇지 않으면 세션이 생성된다.
따라서 HttpSession타입으 파라미터는 항상 null이 아니다.

-
Share:

Spring 객체와 HTML 폼

스프링 MVC는 HTML폼에 입력한 데이터를 자바빈 객체를 이용해서 전달 받을수 있다.
@RequestMapping 가 적용된 메서드에 파라미터로 자바빈 타입을 추가하면
set 메서드에 매핑된다.

파라미터에 적용된 커맨드 객체는 모델에 자동으로 추가되서 View에서
${객체명.html에서name속성} 으로 지정할 수 있다.

@ModelAttribute를 통해 객체명 부분을 변경 가능하다.
Share:

Srping 인코딩 필터 설정

요청 파라미터의 캐릭터 인코딩을 web.xml 에서 encodingFilter 통해 설정 할수 있다.

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC-KR</param-value>
   </init-param>
 </filter>
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>


Share:

Spring DispatcherServlet

- DispatcherServlet 설정

: 1개의 WebApplicationContext를 갖는다.
: WEB-INF 밑에 [서블릿이름]-servlet.xml 파일로 부터 설정 정보를 읽어온다.

아래와 같이 web.xml 에 설정 했으면 dispatcher-servlet.xml 에서 정보를 읽는다.

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
한 개 이상의 설정 파일을 설정해야 하는경우는 다음과 같이 한다. contextConfigLocation 초기화 파라미터는 설정 파일 목록을 값으로 갖는데 
콤마(,), 공백문자(" "), 탭(\t), 줄바꿈(\n), 세미콜론(";)을 이용하여 구분한다.
경로는 웹 어플리케이션 root 디렉터리를 기준으로 한다.

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value> 
     /WEB-INF/main.xml 
     /WEB-INF/dev.xml
   </param-value>
  </init-param>
 </servlet>

아래와 같은 경우에는 각각 WebapplicationContext를 생성하기 떄문에
동시에 사용할 수 있는 공통빈 필요한 경우 ContextLoaderListener을 통해 설정이 가능하다. ContextLoaderListener 는 contextConfigLocation를 명시하지 않으면 /WEB-INF/applicationContext.xml을 설정 파일로 사용한다.
classpath에서 정보를 읽어 오고 싶으면 'classpath:' 접두어를 사용하면 된다.

ContextLoaderListener  가 root Context 가 되고 dispatcherServelt 가 생성하는 Context가 자식이 된다.


<servlet>
  <servlet-name>Adispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 

<servlet>
  <servlet-name>Bdispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
 </servlet>
 


<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
           /WEB-INF/dev.xml 
           /WEB-INF/common.xml 
           classpath:config/conf.xm
     </param-value>
</context-param>

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

Share:

Srping execution 표현식

- execution 명시자
: Advice를 적용할 메서드를 명시할 때 사용.
   
- 기본 형식

execution(수식어패턴? 리턴타입패턴 패키지패턴?이름패턴(파라미터패턴)
▶ 수식어 패턴
  - 생략가능한 부분.
  - public, protected 등이 옴.
▶ 리턴타입패턴
  - 리턴 타입을 명시
▶ 클래스이름 패턴, 이름패턴
  - 클래스 이름 및 메서드 이름을 패턴으로 명시.
▶ 파라미터패턴
  - 매칭될 파라미터에 대해서 명시.

- 특징
: 각 패턴은 '*'를 이용하여 모든 값을 표현.
: '..'을 이용하여 0개 이상이라는 의미를 표현.

- EX

▶ execution(public void set*(..))
  - 리턴 타입이 void이고 메서드 이름이 set으로 시작하고, 파라미터가 0개 이상인 메서드 호출.
▶ execution(* com.spring.chap.core.*.*())
  - com.spring.chap.core 패키지의 파라미터가 없는 모든 메서드 호출.
▶ execution(*.com.spring.chap.core..*.*(..))
  - com.spring.chap.core 패키지 및 하위 패키지에 있는 파라미터가 0개 이상인 메서드 호출.
▶ execution(Integer com.spring.chap.core.DevService.delete(..))
  - 리턴 타입이 Integer인 DevService 인터페이스의 delete() 메서드 호출.
▶ execution(* get*(*))
  - 이름이 get으로 시작하고 1개의 파라미터를 갖는 메서드 호출.
▶ execution(* get*(*, *))
  - 이름이 get으로 시작하고 2개의 파라미터를 갖는 메서드 호출.
▶ execution(* read*(Integer, ..))
  - 메서드 이름이 read로 시작하고, 첫 번째 파라미터 타입이 Integer이며, 1개 이상의 파라미터를 갖는 메서드 호출.

within 명시자
- 메서드가 아닌 특정 타입에 속하는 메서드를 Pointcut으로 설정할 때 사용.

EX
▶ within(com.spring.chap.core.DevService)
  - DevService인터페이스의 모든 메서드 호출.
▶ within(com.spring.chap.core.*)
  - com.spring.chap.core 패키지에 있는 모든 메서드 호출.
▶ within(com.spring.chap.core..*)
  - com.spring.chap.core 패키지 및 그 하위 패키지에 있는 모든 메서드 호출.

bean 명시자
- 스프링 빈 이름을 이용하여 Pointcut을 정의


EX

▶ bean(Dev)
: 이름이 Dev인 빈의 메서드 호출

▶ bean(*DevService)
: 이름이 DevService로 끝나는 빈의 메서드 호출

Share:

2017년 3월 10일 금요일

ORACLE 튜닝


- 처음 컬럼이 where 조건절에 존재하지 않으면 index를 Access할 수 없다.
- Unique index는 Unique Scan 과 Range Scan 모두 가능하다. Unique Scan은 Unique Index의 구성 칼럼 모두에 대해 where 조건 절에서 EQUAL(=) 상수 받을 때의 Access.
- Unique 인덱스의 구성 칼럼 모두와 EQUAL(=) 상수 모두를 만족 시키지 못하면 Range Scan을 한다. Range Scan의 경우 적어도 하나의 컬럼에 대하여 where 조건절에서 EQUAL(=) 상수 를 받을 때의 Access 행위를 말하고 모든 Index의 where조건절에 없을 경우도 해당이 된다.
- Non Unique 인덱스는 Range Scan하고 비교연산자 상수를 받을때 Accesss이다.

- 실행계획보기
1. explain plan for SQL문
2. select * from table(dbms_xplan.display);

- 결한인덱스 변경시 기존 SQL문에도 영향이 있고 순서가 중요하다.
- 결한 인덱스 첫번째 컬럼 연산자가  EQUAL(=) 이여야 한다.
- 옵티마이저는 컬럼의 매칭율이 높은것중 최근에 생성된 Index를 ACCESS 한다.
- index Suppressing
: CHAR나 VACRH의 DATE TYPE과 DATE를 비교할 경우 DATE DATA TYPE 기준으로 비교되는것에 함수에 적용된다.
ex)  컬럼 TD_DATE 가 DATE TYPE일 경우
WHERE TD_DATE = '20170311' 일 경우  WHERE TD_DATE = TO_dATE( '20170311' , 'YYYYMMDD') 로 사용.
:  CHAR나 VACRH의 DATE TYPE과 NUMBER를 비교할 경우 NUMBER DATATYPE 기준으로 비교되는것에 함수에 적용된다.
EX) WHERE CODE = 0544 는 내부적으로 WHERE TO_NUMBER(CODE) = 0544 로 사용.

- EXISTS는 주어진 조건을 만족하는 첫번쨰 레코드를 만나면 트랜잭션을 멈춘다.
- JOIN은 순서에따라 영향을 받는다. ( 처리가 좁은 테이블부터 시작하게 한다.)

- Driving Table이란 가정 먼저 Access하는 Table이다.
-Cost Base Optimizer : 통계쩡보가 먼저 우선하며 동일조건일 경우 from절의 앞 테이블이 Driving Table됨.
- Rule Base Optimizer : 동일조건일 경우 from 절의 뒤 Table이 Driving Table이 됨.

-일반적으로 동일 조건일경우 From절의 뒤부터 먼저 ACCESS된다. (Optimizer MOME가 RULE이거나 CHOOSE인 경우 )

- Nested Loop Join
: 부분범위처리를 하는경우
: 순차적으로 처리
: Driving table의 인덱스 액세스는 첫번쨰 로우만 Random Access이고 나머지는 Scan
연결작업은 Random Access 이다.

- Sort Merge Join
: 전체범위를 처리하는경우
: Euqi-Join에 대해서만 가능
: HINT USER_MERGE을 사용해 일반적으로 구현
: 자신의 인덱스를 사용하는 경우만 Random Access이고 Merge작업은 Scan방식
: 상수값을 받아 줄여진 범위가 30%이상이면 Sort/Merge Join이 유리함.
: 처리량이 많은경우 ( Random Access를 하지 않으므로 )
: 자신의 처리범위를 줄이는게 관건.

-Hash Join
: 전체범위를 처리하는 경우 유리.
: HINT USER_HASH를 사용해 일반적으로 구현
: Oracle8 Server는 Cost-Based 옵티마이저를 사용할 경우만 Hash Join을 고려.
: Hash Join/Merge Join의 사용 여부는 옵티마이저가 결정하며, 조인 칼럼들에 unique 해쉬 값을 생성하는데 유리한 테이블을 지정함.
: Equi-Join에 대해서만 가능
: Hash Function을 이용해 메모리와 CPU를 많이 사용해 대용량 데이터 처리할경우 사용.
: 양쪽 테이블의 scan이 동시에 이루어지므로 Parallel Query Option사용하면 효과적.
: 자신의 처리범위를 줄이는게 관건.
: 처리량이 많은경우 ( Random Access를 하지 않으므로 )

- Outer Join
: IN, OR 비교 연산자는 사용할수 없으므로 IN LINE VIEW 이용한다.
: 모든 컬럼에 반드시 (+)를 사용해야 한다.
: 기준이 되는 테이블이 반드시 DRIVING TABLE이 된다.

- MAX 함수
: HINT INDEX_DESC 를 이용해서 Access를 줄인다.

- UNION
: 중복되는 사항이 없는경우 SORT 하지 않는 UNION ALL을 사용한다.

- Exists
: 주오진 조건을 만족하는 첫 번째 레코드를 만나면 트랜잭션을 멈춘다.



- 통계정보 관련 명령어

--관리자로 로그인
sqlplus
sys

-- 파일실행 ( 해당 경로로 가서 sqlplus 실행 )
@파일이름.sql

-- 옵티마이저 정보 보기
SHOW PARAMETER OPTIMIZER

--권한 변경
ALTER SYSTEM SET OPTIMIZER_MODE=RULE SCOPE=SPFILE;
ALTER SYSTEM SET OPTIMIZER_MODE=ALL_ROWS SCOPE=SPFILE;

-- 재시작
STARTUP FORCE

-- 통계만들기
ALTER SESSION SET SQL_TRACE=TRUE;

sql문

ALTER SESSION SET SQL_TRACE=FALSE;

-- SQL_TRACE 여부
SHOW PARAMETER TIMED_STATISTICS

--TRC 파일 위치
SHOW PARAMETER USER_DUMP_DEST

-- 통계정보 새로 생성
ANALYZE TABLE TAB35 COMPUTE STATISTICS;

-- 테이블의 기존 통계정보를 이용하여 생성
ANALYZE TABLE TAB35 ESTIMATE STATISTICS;

-- tkf 생성
tkprof 기존파일명.trc 만들파일명.TKF SYS=NO EXPLAIN=로그인ID/PW

Share:

2017년 3월 8일 수요일

2017년 2월 19일 일요일

2017년 2월 15일 수요일

sendRedirect에 상대 경로 사용하기

1. / 가 없는 경우에는 원래 경로를 추가하여 절대경로를 만든다.
ex )
http://www.bologger.com/myproject/google/main.do 에서
sendRedirect("test/test.html) 를 호출 했다면
컨테이너는 원래 주소를 가지고 전체 경로를 재작성 합니다.
(Location 헤더에는 전체 경로가 들어가야 하기 떄문이다)
http://www.bologger.com/myproject/google/test/test.html 로 이동한다.

2. 하지만 상대 경로가 / 로 시작하는 경우
sendRedirect("/test/test.html) 를 호출 했다면
컨테이너는 웹 어플리케이션에서부터 URL 전체 경로를 재작성해서
http://www.bologger.com/myproject/test/test.html 로 이동한다.
Share:

Jquery trigger 함수

trigger() 메서드는 요소에 등록된 이벤트 핸들러만 실행시킨다.
예) <a> 요소에 click 이벤트를 적용해도 href 속성이 실행되지 않는다.
Share:

2017년 2월 11일 토요일

2017년 2월 4일 토요일

2017년 1월 29일 일요일

Jquery 이미지 드래그 설정 ( Web, Mobile )

1.  스크립트 파일을 추가한다. 웹 2개 모바일 2개
모바일은 jquery.ui.touch-punch.min.js 파일을 다운받아 하나더 추가한다.
주소 : https://github.com/furf/jquery-ui-touch-punch


//웹용 스크립트 파일
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
//모바일용 스크립트 파일 
<script src="http://code.jquery.com/jquery.min.js"></script>

사용시 예제 소스


$(".img_icons").draggable({
 start : function(event) {
  img_choice = $(this).attr("src");
  img_choice_id = $(this).attr("id");
 },
 stop : function() {
  
 },
 revert : true
});

$(".drop_box").droppable({
 drop : function(event, ui) {
  if (img_choice_id) {    
   if ($(this).attr("id") == "drop_box") {
    if (img_choice == "이미지 주소") {   

    }
   }else {
    alert("error");
   }
  }
  
 }
});              

<!-- 이미지 넣을 투명 공간 -->
<div class="drop_box" id="drop_box">
     <img src=" id="icon_none" />
</div>
<!-- 이미지 넣을 투명 공간 -->

<!-- 옮길 이미지  -->
<div class="img_icons" id="over_1">
 <img alt="" class="img_icon" src="" id="img_icon_1" />            
</div>
<div class="img_icons" id="over_2">
 <img alt="" class="img_icon" src="" id="img_icon_2" />            
</div>
<!-- 옮길 이미지  -->
Share:

sublime Text SFTP 기본 설정

{
    // The tab key will cycle through the settings when first created
    // Visit http://wbond.net/sublime_packages/sftp/settings for help
   
    // sftp, ftp or ftps
    "type": "ftp",

    "save_before_upload": true, //저장하기 전에 업로드할지 여부를 체크한다.
    "upload_on_save": true, // 업로드 하면서 저장할지 여부를 체크한다
    "sync_down_on_open": false, // 다운로드 및 오픈하면서 동기화할지 여부를 체크한다
    "sync_skip_deletes": false, //삭제한 파일은 동기화에 제외시킬지 여부를 체크한다
    "sync_same_age": true,    // 수정시간이 같은 파일 동기화 여부
    "confirm_downloads": false, //다운로드 확인 여부를 체크한다.
    "confirm_sync": true,  // 동기화 시 확인 여부
    "confirm_overwrite_newer": false, //확인된 파일의 덮어쓰기 여부를 체크하여 새로 만들지 여                                                                      부를 체크한다.

   
    "host": "주소",
    "user": "아이디",
    "password": "비밀번호",
    "port": "21",
   
    "remote_path": "폴더위치",
    "ignore_regexes": [
        "\\.sublime-(project|workspace)", "sftp-config(-alt\\d?)?\\.json",
        "sftp-settings\\.json", "/venv/", "\\.svn/", "\\.hg/", "\\.git/",
        "\\.bzr", "_darcs", "CVS", "\\.DS_Store", "Thumbs\\.db", "desktop\\.ini"
    ],
    //"file_permissions": "664",
    //"dir_permissions": "775",
   
    //"extra_list_connections": 0,

    "connect_timeout": 30,
    //"keepalive": 120,
    //"ftp_passive_mode": true,
    //"ftp_obey_passive_host": false,
    //"ssh_key_file": "~/.ssh/id_rsa",
    //"sftp_flags": ["-F", "/path/to/ssh_config"],
   
    //"preserve_modification_times": false,
    //"remote_time_offset_in_hours": 0,
    //"remote_encoding": "utf-8",
    //"remote_locale": "C",
    //"allow_config_upload": false,
}

Share:

2017년 1월 26일 목요일

2017년 1월 18일 수요일

iframe 에서 부모창 접근하기

부모창 소스

<html>
<body>
<iframe id="test1" frameborder="0" src="test.jsp"></ifame>
<body>
<html>

이라고 가정한다면
test.jsp 소스에서
parent.document.getElementById(부모창에 있는 iframe아이디) 
를 통해 iframe 속성에 접근한다.

test.jsp 안에서 부모에 있는 iframe 창의 높이를 수정해서 보여줄려고 한다면
onload 나 document.ready 를 활용해서 
parent.document.getElementById("test1").height = document.body.offsetHeight;
을 통해 조절 가능하다.

* 참고

- XHTML 표준이 없다 

가로길이
document.body.offsetWidth 
document.body.scrollWidth // (문서 전체의 크기)
document.body.clientWidth // (창의 크기)

세로길이
document.body.offsetHeight
document.body.scrollHeight //(문서 전체의 크기)
document.body.clientHeight // (창의 크기)

- HTML5 표준이 정해져 있다. 

가로 길이
window.innerWidth // 브라우저 윈도우 두께를 제외한 실질적 가로 길이
window.outerWidth // 브라우저 윈도우 두께를 포함한 브라우저 전체 가로 길이

세로길이
window.innerHeight // 브라우저 윈도우 두께를 제외한 실질적 세로 길이

window.outerHeight // 브라우저 윈도우 두께를 포함한 브라우저 전체 세로 길이

Share:

2017년 1월 14일 토요일