분류 전체보기
- tail명령어 no space left on device(장치에 남은 공간이 없음) 오류 해결 2019.05.21
- postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK ) 2019.03.13
- poi-object-mapper 라이브러리를 사용하여 엑셀 데이터 바인딩하기 2019.02.26
- 포트번호로 프로세스 찾기(WAS 포트 겹칠 때) 2019.02.22
- crontab 설정 2019.02.22
- WAS서버가 모두 죽었을 경우 웹서버 설정으로 오류페이지 호출 방법 2019.02.22
- 리눅스] BASH 쉘의 로그인 과정 2019.02.22
- jsp에서 jqery template을 사용할 때 2019.02.18
- 옵저버패턴(Observer Pattern) 2019.02.10
- 스트래티지 패턴(strategy pattern) 2019.02.03
tail명령어 no space left on device(장치에 남은 공간이 없음) 오류 해결
tail 명령어 실행 시에 하드웨어에 남은 용량이 있음에도 불구하고
no space left on device(장치에 남은 공간이 없음) 오류가 발생하면
-> 용량부족이 아닌 시스템 감시자(sysctl fs.inotify.max_user_watches)가 부족하기 때문
https://www.veritas.com/support/en_US/article.100039721
위의 URL을 참고하여서
sysctl fs.inotify.max_user_watches=65536
로 수정해주면 된다.
postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK )
1. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 각 선수별로 가능한 포메이션을 기준으로 ROW_NUM 세팅 )
ROW_ID | NAME |
FORMATION | ROW_NUM |
1 | ERIKSEN | LWF | 1 |
2 | ERIKSEN | RWF | 2 |
3 | ERIKSEN | CAM | 3 |
4 | ERIKSEN | CM | 4 |
5 | KANE |
CF | 1 |
6 | SON |
CF | 1 |
7 | SON |
LWF | 2 |
8 | SON |
RWF | 3 |
9 | SON |
CAM | 4 |
10 | VERTONGHEN | CB | 1 |
11 | VERTONGHEN | LB | 2 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY ROW_ID ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 선수이름을 그룹으로 묶어서 ROW_NUMBER() 계산한다.
키워드 : ROW_NUMBER / PARTITION BY
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 2 |
4 | ALLI | 4 | 3 |
5 | LAMELA | 4 | 3 |
6 | MOURA | 4 | 3 |
7 | VERTONGHEN | 3 | 4 |
8 | ALDERWEIRELD | 2 | 4 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,DENSE_RANK() OVER( ORDER BY GOAL DESC) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생기지 않는다 -> DENSE_RANK 함수 사용
키워드 : DENSE_RANK
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 3 |
4 | ALLI | 4 | 4 |
5 | LAMELA | 4 | 4 |
6 | MOURA | 4 | 4 |
7 | VERTONGHEN | 3 | 7 |
8 | ALDERWEIRELD | 2 | 7 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER( ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
키워드 : RANK
4. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 선수 역할을 기준으로 득점 순위 계산 )
* 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위 발생
ROW_ID | ROLL | NAME |
GOAL | ROW_NUM |
1 | ST | KANE |
15 | 1 |
2 | ST | SON |
15 | 1 |
3 | ST | LIORENTE | 10 | 3 |
4 | MF | ERIKSEN | 6 | 1 |
5 | MF | ALLI | 4 | 2 |
6 | MF | LAMELA | 4 | 2 |
7 | MF | MOURA | 4 | 2 |
8 | MF | WANYAMA | 1 | 5 |
9 | DF | VERTONGHEN | 3 | 1 |
10 | DF | ALDERWEIRELD | 2 | 2 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER ( PARTITION BY ROLL ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 포지션 별 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
포지션을 그룹으로 묶어준다 -> PARTITION BY 사용
키워드 : RANK / PARTITION BY
'DB' 카테고리의 다른 글
GRANT 권한 주기. SEARCH_PATH 세팅. (postgreSQL) (0) | 2019.11.22 |
---|---|
PostgreSQL에서 not equal 시 null 값 포함하여 처리하기(IS DISTINCT FROM) (0) | 2019.10.14 |
poi-object-mapper 라이브러리를 사용하여 엑셀 데이터 바인딩하기
- 도입배경
: 업체에서 256개의 열의 엑셀을 떨어뜨려 달라고 함. (하드코딩으로는 도저히 관리가 안 될듯 함)
- 도입과정
1) https://github.com/millij/poi-object-mapper 주소를 참고
2) 스프링이 아닌 회사 자체 프레임워크를 기반으로 개발하고 있기 때문에 maven이 아닌 jar파일 다운로드
(https://jar-download.com/artifact-search/poi-object-mapper)
3) 해당 jar파일 commit
4) 이슈사항 발생
4-1) 기존 poi 버전(3.10)과 poi-object-mapper의 poi버전(3.17) 충돌 발생
4-2) 기존 jar파일의 확장자를 jar_ 처리 후 3.17로 기존 엑셀다운로드 확인
-> But... 기존의 엑셀다운로드 기능이 3.17 버전에서는 오류 발생
-> 기존 거를 수정하기에는 공통단을 건드려야 하는 부분이라 공수가 상당히 큼
-> 여기서 라이브러리 사용은 포기....
5) 이왕 jar파일 다운 받아본 거 돌려보기라도 하자.!
6) 3.10 jar 확장자를 jar_ 처리
7) 3.17로 테스트 해보기.
8) Unsupported major.minor version 51.0 익셉션 발생
9) 현재 모듈은 openJDK 1.6 으로 WAS 실행하고 있음. openJDK 1.8로 WAS설정 후 재기동 테스트
10) java.lang.ClassNotFoundException: org.dom4j.Namespace 익셉션 발생
11) dom4j.jar파일 commit
12) 정상동작 확인
- 출력소스
List people = new ArrayList<Person>(); people.add(new Person(20,"김똥개")); people.add(new Person(25,"홍길동")); people.add(new Person(29,"김철수")); String CHARSET = "UTF-8"; response.setContentType("application/vnd.ms-excel;charset="+CHARSET); String userAgent = request.getHeader("User-Agent"); if (userAgent.indexOf("MSIE 5.5") > -1) { // MS IE 5.5 이하 response.setHeader("Content-Disposition", "filename=" + URLEncoder.encode(fileName, "UTF-8") + ";"); } else if (userAgent.indexOf("MSIE") > -1) { // MS IE (보통은 6.x 이상 가정) response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") + ";"); } else if (userAgent.indexOf("Trident") > -1) { // MS IE 11 fileName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ";"); } else { // 모질라나 오페라 response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes(CHARSET), "latin1") + ";"); } SpreadsheetWriter writer = new SpreadsheetWriter(response.getOutputStream()); writer.addSheet(Person.class,people); out.clear(); out = pageContext.pushBody(); writer.write();
- 엑셀 출력 결과
- 결론
나중에 이 라이브러리를 사용하게 된다면, 스타일 세팅하는 부분 재확힌 해보기.
이제 WAS jdk 설정 / jar 설정 / 소스 수정한 거 모두 원상복구 해놓자...........................................ㅎㅎ;;
'경험, 느낀 점' 카테고리의 다른 글
개발/운영 설정파일 개념. (0) | 2019.01.31 |
---|
포트번호로 프로세스 찾기(WAS 포트 겹칠 때)
'Linux' 카테고리의 다른 글
Apache(웹서버) & Tomcat(WAS) 설치 및 연동 (0) | 2019.07.07 |
---|---|
Cent OS 7 설치 및 기본세팅 (0) | 2019.07.07 |
crontab 설정 (0) | 2019.02.22 |
리눅스] BASH 쉘의 로그인 과정 (0) | 2019.02.22 |
해당 디렉토리 트리에서 심볼릭링크 찾기 (0) | 2019.01.31 |
crontab 설정
'Linux' 카테고리의 다른 글
Apache(웹서버) & Tomcat(WAS) 설치 및 연동 (0) | 2019.07.07 |
---|---|
Cent OS 7 설치 및 기본세팅 (0) | 2019.07.07 |
포트번호로 프로세스 찾기(WAS 포트 겹칠 때) (0) | 2019.02.22 |
리눅스] BASH 쉘의 로그인 과정 (0) | 2019.02.22 |
해당 디렉토리 트리에서 심볼릭링크 찾기 (0) | 2019.01.31 |
WAS서버가 모두 죽었을 경우 웹서버 설정으로 오류페이지 호출 방법
★ WAS서버가 모두 죽었을 경우 Apache 웹서버에서 세팅한 html페이지를 호출해준다.
- 오류페이지 세팅 파일 : apache/conf/extra/httpd-vhosts.conf (http)
apache/conf/extra/httpd-ssl.conf (https)
- <VirtualHost> 아래에 호출할 오류페이지 ErrorDocument 삽입
리눅스] BASH 쉘의 로그인 과정
https://ttend.tistory.com/547
해당 URL참고
'Linux' 카테고리의 다른 글
Apache(웹서버) & Tomcat(WAS) 설치 및 연동 (0) | 2019.07.07 |
---|---|
Cent OS 7 설치 및 기본세팅 (0) | 2019.07.07 |
포트번호로 프로세스 찾기(WAS 포트 겹칠 때) (0) | 2019.02.22 |
crontab 설정 (0) | 2019.02.22 |
해당 디렉토리 트리에서 심볼릭링크 찾기 (0) | 2019.01.31 |
jsp에서 jqery template을 사용할 때
jsp에서 jqery template을 사용할 때 생기는 문제 및 해결방안
※ 문제
jsp의 EL Tag도 ${} 를 쓰고
jquery의 template도 ${} 를 쓰기 때문에
jqery의 template을 사용하고자 ${}를 쓰게 되면
서버단의 jsp에서 EL Tag로 인식하여 오류가 발생한다.
※ 해결책
1) 해당 페이지에 ELignored 명시
<%@page isELIgnored="true" %>
2) web.xml Config 설정
true
3) 코드 기입 방법(변수)
3-1) {{html item}}
3-2) {{= item}}
{{html rec2.LINE_NO }}
{{= rec2.LINE_NO }}
4) 코드 기입 방법(함수)
- template에서 함수 사용시 ${}는 필수이기 때문에 jsp의 EL Tag와 겹치지 않는 것이 중요하다.
4-1) ${} 안에 ${ '${' } 로 명시해주기
4-2) ${} 앞에 \ 사용
${'${'} formatter.number(( rec2.AM_DR ) }
\${ formatter.number(( rec2.AM_DR ) }
'Javascript' 카테고리의 다른 글
IE에서 iframe(레이어 팝업) reload 시에 input text 태그 미작동 오류 (0) | 2020.03.03 |
---|---|
jquery event에 parameter를 전달하고자 할 때 (0) | 2019.01.24 |
opener를 사용하지 못할 때 (0) | 2018.04.12 |
파일다운로드 완료 시 로딩바 종료 (0) | 2017.08.24 |
옵저버패턴(Observer Pattern)
1. 옵저버 패턴 정의
- 옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고
자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.
'디자인패턴' 카테고리의 다른 글
스트래티지 패턴(strategy pattern) (0) | 2019.02.03 |
---|---|
디자인 패턴 소개. (0) | 2019.02.03 |
스트래티지 패턴(strategy pattern)
1. 스크래티지 패턴(Strategy Pattern)
- 스트래티지 패턴(Strategy Pattern)에서는 알고리즘군을 정의하고 각각을 "캡슐화"하여 교환해서 사용할 수 있도록 만든다.
스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
2. p63. 연습문제
2-1. 클래스를 정돈합니다.
2-2. 추상클래스 1개, 인터페이스 1개, 클래스 8개를 구분합니다.
2-3. 클래스들을 화살표로 연결합니다.
a. 상속(확장)에 대해서는 ㅡㅡㅡㅡㅡ▷
b. 인터페이스에 대해서는 -----------▷
c. A에는 B가 있다 관계에 대해서는 ㅡㅡㅡㅡ>
2-4. 적당한 클래스를 찾아서 setWeapon() 메소드를 찾아 넣으세요
★ Chracter 추상클래스
public abstract class Character { WeaponBehavior weapon; public abstract void fight(); public void setWeapon(WeaponBehavior weapon) { this.weapon = weapon; } }
★ WeaponBehavior 인터페이스
public interface WeaponBehavior { public void useWeapon(); }
★ WeaponBehavior 인터페이스를 구현하는 클래스
public class AxeBehavior implements WeaponBehavior{ public void useWeapon() { System.out.println("도끼를 씁니다."); } } public class BowAndArrowBehavior implements WeaponBehavior{ public void useWeapon() { System.out.println("활과 화살을 씁니다."); } } public class KnifeBehavior implements WeaponBehavior{ public void useWeapon() { System.out.println("칼을 씁니다."); } } public class SwordBehavior implements WeaponBehavior{ public void useWeapon() { System.out.println("검을 씁니다."); } }
★ Chracter 추상클래스를 상속받는 클래스
public class King extends Character{ public King() { weapon = new AxeBehavior(); } public void fight() { weapon.useWeapon(); } } public class Knight extends Character{ public Knight() { weapon = new BowAndArrowBehavior(); } public void fight() { weapon.useWeapon(); } } public class Queen extends Character{ public Queen() { weapon = new KnifeBehavior(); } public void fight() { weapon.useWeapon(); } } public class Troll extends Character{ public Troll() { weapon = new SwordBehavior(); } public void fight() { weapon.useWeapon(); } }
★ Main 메소드
public static void main(String[] args) { // TODO Auto-generated method stub Character king = new King(); Character knight = new Knight(); Character queen = new Queen(); Character troll = new Troll(); king.fight(); knight.fight(); queen.fight(); troll.fight(); // king 무기 변경 king.setWeapon(new KnifeBehavior()); king.fight(); }
- 실행결과 :
도끼를 씁니다. // king.fight()
활과 화살을 씁니다. // knight.fight()
칼을 씁니다. // queen.fight()
검을 씁니다. // troll.fight()
칼을 씁니다. // king.fight()
★ 결론
- 각 캐릭터 클래스 별로 fight를 하는 특징이 모두 다르다.
이 때 단순히 상속을 통한 오버라이드를 통해서도 구현이 가능하다.
하지만, fight를 하지 않는 캐릭터가 추가된다면? 의미없는 fight함수의 오버라이드가 추가되여야 하며
또, 100개의 도끼를 사용하는 캐릭터를 오버라이드하여 구현해놓았는데, 도끼를 사용하는 방식이 달라진다면?
100개의 오버라이드 되어있는 함수를 모두 일일이 수정해야 하는 상황이 발생할 수 있다.
- 하지만 이를 캡슐화하여서 'A에는 B가있다' 관계를 통해 추상클래스에 구현체를 포함시켜 상속을 활용하면
이러한 문제점을 해결할 수 있다.!
☆ 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.
☆ 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
☆ 상속보다는 구성을 활용한다.
'디자인패턴' 카테고리의 다른 글
옵저버패턴(Observer Pattern) (0) | 2019.02.10 |
---|---|
디자인 패턴 소개. (0) | 2019.02.03 |