Env2020. 10. 25. 16:07

증상

타이핑할때마다 에러메시지가 Text Editor에 새 줄로 표시되어, 속도 저하 및 코딩작업 방해 

 

해결방법

 

설정 변경 후

좌측 에러아이콘에 마우스 hover로 에러 내용 확인 가능

 

Posted by 이야봉
Env2020. 10. 25. 14:52

 

원인

Spring Boot 프로젝트 생성시 탬플릿 엔진 지정 누락

 

 

해결방법

1. build.gradle파일 > dependencies {} 블록에 탬플릿엔진(ex: thymeleaf) 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    ...
    ...
    ...
}

2. gradle refresh

3. Spring Boot 재기동 

 

 

   

 

Posted by 이야봉
Java2020. 10. 18. 17:25

공업/방업 수치가 동일한 저글링은 같은 저글링으로 가정하고,

중복 제거하여 1기로 취급하도록 구현

 

 

1. 저글링 클래스

package prac01;

public class Zergling {
	// 필드
	String name;		// 유닛명
	int attackUp;		// 공업 단계(0~3)
	int armorUp;		// 방업 단계(0~3)
	
	// 생성자
	public Zergling(String name, int attackUp, int armorUp) {
		this.name = name;
		this.attackUp = attackUp;
		this.armorUp = armorUp;
	}
	
	@Override
	public String toString() {
		return "Zergling [name=" + name + ", attackUp=" + attackUp + ", armorUp=" + armorUp + "]";
	}
	
}

 

2.1. HashSet을 이용한 중복제거 실행 클래스

package prac01;

import java.util.HashSet;
import java.util.Set;

public class ZerglingMain {
	public static void main(String[] args) {
		Set<Zergling> set = new HashSet<>();
		
		Zergling z1 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z2 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z3 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z4 = new  Zergling("Zergling", 3, 0);		// 공3업 저글링
		Zergling z5 = new  Zergling("Zergling", 3, 3);		// 풀업 저글링
		Zergling z6 = new  Zergling("Zergling", 3, 3);		// 풀업 저글링
		Zergling z7 = new  Zergling("Zergling", 1, 1);		// 공방1업 저글링
		
		set.add(z1);
		set.add(z2);
		set.add(z3);
		set.add(z4);
		set.add(z5);
		set.add(z6);
		set.add(z7);
		
		System.out.println("set.size(): " + set.size());
		for (Zergling z : set) {
			System.out.println(z.hashCode());
			System.out.println(z);
		}
		
	}
}

2.2. 실행결과

set.size(): 7
2046562095
Zergling [name=Zergling, attackUp=0, armorUp=0]
932172204
Zergling [name=Zergling, attackUp=3, armorUp=3]
1225358173
Zergling [name=Zergling, attackUp=1, armorUp=1]
1342443276
Zergling [name=Zergling, attackUp=0, armorUp=0]
1587487668
Zergling [name=Zergling, attackUp=3, armorUp=0]
1199823423
Zergling [name=Zergling, attackUp=3, armorUp=3]
769287236
Zergling [name=Zergling, attackUp=0, armorUp=0]

※ 중복제거 실패

 

3.1. 저글링 클래스 보완(hashCode, equals 메소드 재정의)

package prac01;

public class Zergling {
	// 필드
	String name;		// 유닛명
	int attackUp;		// 공업 단계(0~3)
	int armorUp;		// 방업 단계(0~3)
	
	// 생성자
	public Zergling(String name, int attackUp, int armorUp) {
		this.name = name;
		this.attackUp = attackUp;
		this.armorUp = armorUp;
	}
	
	@Override
	public int hashCode() {
		return this.name.hashCode() + this.attackUp + this.armorUp;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Zergling) {
			Zergling tmp = (Zergling)obj;
			if (this.attackUp == tmp.attackUp && this.armorUp == tmp.armorUp) {
				return true;
			}
		}
		return false;
	}

	@Override
	public String toString() {
		return "Zergling [name=" + name + ", attackUp=" + attackUp + ", armorUp=" + armorUp + "]";
	}
	
}

 

3.2. 저글링 클래스 보완 후 재실행 결과

set.size(): 4
744866486
Zergling [name=Zergling, attackUp=0, armorUp=0]
744866492
Zergling [name=Zergling, attackUp=3, armorUp=3]
744866489
Zergling [name=Zergling, attackUp=3, armorUp=0]
744866488
Zergling [name=Zergling, attackUp=1, armorUp=1]

※ 중복제거 성공 (공업, 방업 수치가 동일한 저글링은 같은 개체로 취급)

 

 

참조
marobiana.tistory.com/100
superfelix.tistory.com/61

 

 

 

 

Posted by 이야봉
Env2020. 10. 11. 13:40

1. 설정 변경(해제)

 

2. 변경사항 확인

 

 

 

Posted by 이야봉
DB2020. 10. 10. 13:48

1. 사용자 생성 및 권한 부여

-- 1.  사용자 생성
CREATE USER asl IDENTIFIED BY [비밀번호]
DEFAULT tablespace USERS
TEMPORARY tablespace TEMP;

-- 2. 권한부여
GRANT RESOURCE, CONNECT TO asl

 

2.1. 경기결과 테이블 생성

-- ASL."RESULT" definition

CREATE TABLE "RESULT" 
   ("SEASON" NUMBER NOT NULL ENABLE, 
"ROUND" NUMBER NOT NULL ENABLE, 
"GAME" NUMBER(1,0) NOT NULL ENABLE, 
"PLAYER_1_ID" VARCHAR2(100) NOT NULL ENABLE, 
"PLAYER_1_NAME" VARCHAR2(100), 
"PLAYER_2_ID" VARCHAR2(100) NOT NULL ENABLE, 
"PLAYER_2_NAME" VARCHAR2(100), 
"WINNER_ID" VARCHAR2(100), 
"DATE" DATE, 
"UPPER_SRG" VARCHAR2(100), 
 CONSTRAINT "RESULT_PK" PRIMARY KEY ("SEASON", "ROUND", "GAME")
   );

   COMMENT ON COLUMN "RESULT"."SEASON" IS '시즌';
   COMMENT ON COLUMN "RESULT"."ROUND" IS '강';
   COMMENT ON COLUMN "RESULT"."GAME" IS '경기';
   COMMENT ON COLUMN "RESULT"."PLAYER_1_ID" IS '선수1 아이디';
   COMMENT ON COLUMN "RESULT"."PLAYER_1_NAME" IS '선수1 이름';
   COMMENT ON COLUMN "RESULT"."PLAYER_2_ID" IS '선수2 아이디';
   COMMENT ON COLUMN "RESULT"."PLAYER_2_NAME" IS '선수2 이름';
   COMMENT ON COLUMN "RESULT"."WINNER_ID" IS '승자 아이디';
   COMMENT ON COLUMN "RESULT"."DATE" IS '경기 날짜';
   COMMENT ON COLUMN "RESULT"."UPPER_SRG" IS '상위_게임유일값(SEASON_ROURND_GAME)';
   COMMENT ON TABLE "RESULT"  IS '경기결과';

 

2.2. 경기결과 데이터 INSERT(8강, 4강, 결승)

INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 8, 1, 'FlaSh', '이영호', 'Action', '김성대', 'FlaSh', TIMESTAMP '2020-03-29 00:00:00.000000', '941');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 8, 2, 'Queen', '김명운', 'Larva', '임홍규', 'Queen', TIMESTAMP '2020-03-31 00:00:00.000000', '941');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 8, 3, 'Stork', '송병구', 'Light', '이재호', 'Light', TIMESTAMP '2020-04-05 00:00:00.000000', '942');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 8, 4, 'ChosimZerg', '박상현', 'Bisu', '김택용', 'ChosimZerg', TIMESTAMP '2020-04-07 00:00:00.000000', '942');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 4, 1, 'FlaSh', '이영호', 'Queen', '김명운', 'Queen', TIMESTAMP '2020-04-12 00:00:00.000000', '921');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 4, 2, 'Light', '이재호', 'ChosimZerg', '박상현', 'Light', TIMESTAMP '2020-04-14 00:00:00.000000', '921');
INSERT INTO "RESULT" (SEASON, ROUND, GAME, PLAYER_1_ID, PLAYER_1_NAME, PLAYER_2_ID, PLAYER_2_NAME, WINNER_ID, "DATE", UPPER_SRG) VALUES(9, 2, 1, 'Queen', '김명운', 'Light', '이재호', 'Queen', TIMESTAMP '2020-04-26 00:00:00.000000', NULL);

 

2.3. 경기 결과 테이블 데이터 입력 사항 조회

SELECT *
FROM RESULT
ORDER BY SEASON, ROUND, GAME

 

3. 계층형 쿼리 사용하여 조회

/*
 * 1. WITH절에서 경기별 고유값을 지정 
 */
WITH BASE AS (
SELECT SEASON,							-- 시즌(9)
       ROUND,                           -- 라운드(8강, 4강, 결승)
       SEASON || ROUND || GAME AS SRG,  -- 경기별 고유값(시즌 + 라운드 + 경기 )
       UPPER_SRG,                       -- 상위 경기 고유값
       GAME,
       NVL2(UPPER_SRG,
        ROUND || '강 ' || GAME || '경기 - ' || PLAYER_1_NAME || ' VS ' || PLAYER_2_NAME,
        '결승 - ' || PLAYER_1_NAME || ' VS ' || PLAYER_2_NAME 
       ) AS TITLE,
       PLAYER_1_NAME,
       PLAYER_2_NAME
FROM RESULT
)
/*
 * 2.경기별 고유값(SRG)와 상위 경기고유값(UPPER_SRG)으로 게층 구현
 */
SELECT SEASON,
       ROUND,
       SRG,
       UPPER_SRG,
       GAME,
       LPAD(' ', 2*(LEVEL-1)) || TITLE AS LPAD_TITLE, --레벨별 들여쓰기
       LEVEL
FROM BASE
START WITH UPPER_SRG IS NULL		-- 결승은 상위 경기고유값이 NULL
CONNECT BY PRIOR SRG = UPPER_SRG    -- 경기별 고유값과 상위 경기고유값으로 연결
ORDER BY GAME

참조
namu.wiki/w/%EC%95%84%ED%94%84%EB%A6%AC%EC%B9%B4TV%20%EC%8A%A4%ED%83%80%EB%A6%AC%EA%B7%B8%20%EC%8B%9C%EC%A6%8C9?from=ASL%20%EC%8B%9C%EC%A6%8C9#s-6

https://dreamstorage.tistory.com/169
https://coding-factory.tistory.com/461

 

 

Posted by 이야봉
Env2020. 10. 4. 16:10

1. ROW 수 1,000개 쿼리 수행

SELECT ROWNUM AS R_NO
FROM DUAL
CONNECT BY ROWNUM <=1000

기본 값 : 200 ROW

 

2. ROW 수 0개(제한없음)로 설정

 

3. ROW 수 제한 해제 후

 

 

 

 

Posted by 이야봉
DB2020. 10. 3. 12:31

1번 테이블

SELECT 'A' T1_COL1 FROM DUAL UNION ALL
SELECT 'B' T1_COL1 FROM DUAL UNION ALL
SELECT 'B' T1_COL1 FROM DUAL UNION ALL
SELECT 'C' T1_COL1 FROM DUAL

 

2번 테이블

SELECT 'A' T2_COL1 FROM DUAL UNION ALL
SELECT 'B' T2_COL1 FROM DUAL UNION ALL
SELECT 'B' T2_COL1 FROM DUAL UNION ALL
SELECT 'B' T2_COL1 FROM DUAL UNION ALL
SELECT 'D' T2_COL1 FROM DUAL

 

 

1번 테이블과 2번테이블 INNER-JOIN

SELECT T1.T1_COL1, T2.T2_COL1
FROM ( SELECT 'A' T1_COL1 FROM DUAL UNION ALL
       SELECT 'B' T1_COL1 FROM DUAL UNION ALL
       SELECT 'B' T1_COL1 FROM DUAL UNION ALL
       SELECT 'C' T1_COL1 FROM DUAL ) T1,
     ( SELECT 'A' T2_COL1 FROM DUAL UNION ALL
       SELECT 'B' T2_COL1 FROM DUAL UNION ALL
       SELECT 'B' T2_COL1 FROM DUAL UNION ALL
       SELECT 'B' T2_COL1 FROM DUAL UNION ALL
       SELECT 'D' T2_COL1 FROM DUAL ) T2
WHERE T1.T1_COL1 = T2.T2_COL1

 

INNER-JOIN 결과

 

'A' : 1 * 1 = 1 ROW
'B' : 2 * 3 = 6 ROW

최종 결과 ROW 수

7 ROW

 

 

참조
SQL BOOSTER
 

SQL BOOSTER

SQL BOOSTER는 프로젝트 성공을 위한 SQL 필독서다. 이 책은 마치 프로젝트를 진행하는 순서처럼 구성되어 있다. 프로젝트 투입을 위해 필요한 SQL 기술을 설명하고, 성능 테스트를 위해 필요한 기술

www.yes24.com

 

 

 

Posted by 이야봉
DB2020. 10. 1. 16:53

 

연습용 테이블 ERD

 

O 업무 프로세스 
 - 고객은 주문을 할 수 있다.

 - 하나의 주문에 여러 개의 아이템을 동시에 주문할 수 있다.

 - 고객은 아이템에 좋고 나쁨을 평가 할 수 있다.

 - 아이템 단가는 이력을 이용해 관리하고 있다.

 

책 링크
SQL BOOSTER
 

SQL BOOSTER

SQL BOOSTER는 프로젝트 성공을 위한 SQL 필독서다. 이 책은 마치 프로젝트를 진행하는 순서처럼 구성되어 있다. 프로젝트 투입을 위해 필요한 SQL 기술을 설명하고, 성능 테스트를 위해 필요한 기술

www.yes24.com

 

 

Posted by 이야봉