.

저번주부터 VSC 에디터로 Spring Boot 프로젝트 개발환경(IDE)을 만들기 위해 작업하였다.

필자는 IDE 환경을 만들기 위해 하나의 폴더(TP_Inplace) 안에 java, maven, VSC, workspace 폴더를 생성하였다.

#주요 폴더 설명

● Java

- Java SE 11 (openJDK) 설치 경로 [C:\TP_Inplace\java\jdk-11.0.2]

Maven

- Maven 3.8.1 설치 경로 [C:\TP_Inplace\maven\apache-maven-3.8.1]

- Maven Repository 경로 [C:\TP_Inplace\maven\repository]

- Repository 경로를 로컬 경로로 맞추기 위해서는 다음과 같이 setting.xml 을 생성 및 수정 해줘야한다.

(C:\TP_Inplace\maven\settings_inplace.xml)    

- localRepository 태그를 설정하게되면 설정한 경로에 Maven Dependencies 의 jar 파일들이 다운로드 된다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

● VSC

만약 내가 구축한 IDE 폴더를 제 2의 사용자가 받아서 VSC를 실행시켰을 때 개발에 필요한 설정값이나, Extensions 설치 파일들이 없어져서 새롭게 다시 설정 및 설치를 해야한다면 좋은 IDE는 아니다.  (ft.min10)

 

VSC의 설정값과 설치 파일들은 기본적으로 

 - C:\Users\사용자아이디\.vscode\extensions

 - C:\Users\사용자아이디\AppData\Roaming\Code

해당 경로로 고정되어있다. 

위에 고정된 경로들을 필자가 구축할 TP_Inplace 폴더안에 설치되도록 설정 해주어야한다. 

 

다음은 경로를 변경하기위한 구체적인 방법이다.

1. VSC 설치하게 되면 Microsoft VS Code 폴더가 생성된다. 해당 폴더를 복사하여 VSC 폴더에 붙여넣어준다. 

2. Microsoft VS Code 폴더에 Code.exe 바로 가기 파일을 생성하여 Visual Studio Code로 이름을 바꿔준다.

3. 바로가기로 만든 파일을 Visual Studio Code로 이름을 변경한 뒤 해당경로로 옮겨준다.

   속성 버튼을 클릭하여 로컬 경로를 지정해준다.

4. 해당 바로가기 아이콘의 속성이서 대상에 경로를 새롭게 지정해준다.

"C:\TP_Inplace\VSC\Microsoft VS Code\Code.exe"

--extensions-dir="C:\TP_Inplace\VSC\Microsoft VS Code\extensions" 

--user-data-dir="C:\TP_Inplace\VSC\Microsoft VS Code\Code"

이제 VSC를 실행시키기 위한 사전준비가 끝났다.

============================================================================

 

이제 설정이 끝난 VSC 에디터를 실행시킨다.

Spring Boot 프로젝트를 생성하기 위해서 Java, Spring boot 확장팩을 설치받아야한다.

1. Java Extension Pack 

2. Spring Boot Extension Pack

설치를 받게 되면 오른쪽 하단에 여러가지 제안들이 나오게 되는데 전부다 Yes, Allow 를 눌러준다. 

그 다음 settings.json(User) 파일, settings.json(Workspace) 파일 환경설정을 진행한다.

 

1. [Ctrl + ,] 단축키를 누르고 java.home 을 검색한다.

2. 다음과 같은 창이 나오게 되고 탭 부분에 User / Workspace 탭으로 나눠져 있는것을 확인할 수 있다. 

Workspace 탭에서 Edit in settings.json 을 클릭하여 json 파일을 연다.

 

다음 설정파일을 적어준다.

{

    "java.home""C:\\TP_Inplace\\java\\jdk-11.0.2",

    "spring-boot.ls.java.home""C:\\TP_Inplace\\java\\jdk-11.0.2",

    "java.configuration.maven.userSettings""C:\\TP_Inplace\\maven\\apache-maven-3.8.1\\conf\\settings.xml",

    "java.configuration.updateBuildConfiguration""automatic"

}

설정파일 설명

"java.home" 

 - 환경변수에 설정한 jdk 버전이 아닌 해당 경로에 설치한 JDK 버전을 java.home 경로 설정

"spring-boot.ls.java.home"

  - Spring boot 실행 시 사용할 java.home 경로 설정

"java.configuration.maven.userSettings"

   - maven repository settings.xml 설정 경로

 

java.home 설정값을 저장하게 되면 Restart 여부를 물어보는데 Yes를 권장한다.

 

3. User 용 settings.json 파일을 연다

다음 설정파일을 적어준다.

{

  "editor.suggestSelection""first",

  "vsintellicode.modify.editor.suggestSelection""automaticallyOverrodeDefaultValue",

  "java.project.importOnFirstTimeStartup""automatic",

  "files.exclude": {

    "**/.classpath"true,

    "**/.project"true,

    "**/.settings"true,

    "**/.factorypath"true

  },

  "redhat.telemetry.enabled"true,

  "window.zoomLevel"0,

  "java.configuration.maven.userSettings""C:\\TP_Inplace\\maven\\apache-maven-3.8.1\\conf\\settings.xml",

  "maven.executable.path""C:\\TP_Inplace\\maven\\apache-maven-3.8.1\\bin\\mvn.cmd",

  "maven.executable.preferMavenWrapper"false,

  "maven.terminal.useJavaHome"true

}

 

설정파일 설명

"maven.executable.path"

   - 사용할 mvc.cmd 파일 경로 지정

"maven.terminal.useJavaHome"

   - maven 빌드 시 사용자가 지정한 java.home 버전을 그대로 사용할 지 선택하는 설정 값

 

============================================================================

 

settings.json 도 설정이 끝났으니 Spring Boot Project를 생성해보자.

1. VSC 에서 단축키 Ctrl + Shift + p 를 누르게되면 다음과 같은 검색창이 나오게 된다. 

해당 검색창에 Spring Initializr: Create a Maven Project 검색하여 선택한다.

2. 버전선택

3. 개발 언어 선택 (Java)

4. Group Id 지정

5. 프로젝트 명 지정

6. 패키징 타입 지정

7. Java Version 지정 (설치한 자바 버전과 동일해야함)

8. Spring Dependencies 지정

   프로젝트를 생성하고 추후에 추가할 수 있으니 기본적인 의존성만 추가하면 된다. 

   필자는 Sptring Boot DevTools, Spring Web, Lombok, Spring Web을 추가하였다.

9. workspace 지정 

workspace 지정을 끝으로 project는 생성이 되며, 바로 Open을 할것인지, workspace에 추가할 것인지 물어보는데 Open 하실것을 권장한다.

 

★프로젝트를 생성 후 Open 후에 pom.xml에 maven-compiler-plugin 설정을 추가해줘야한다. (ft.min10)

            <!-- maven-compiler-plugin 설정 추가 // 메이븐 컴파일 자바버전 강제지정 -->

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>3.8.0</version>

                <configuration>

                   <source>${java.version}</source>

                   <target>${java.version}</target>

                   <fork>true</fork>

                   <executable>C:\\TP_Inplace\\java\\jdk-11.0.2\\bin\\javac</executable>

                   <compilerVersion>${java.version}</compilerVersion>

                </configuration>

            </plugin> 

해당 코드를 추가해준 후 프로젝트를 다시 Reload한다. (다시 프로젝트 오픈)

 

10. 프로젝트를 오픈하게되면 왼쪽 하단에 Spring Boot를 실행하기 위한 작업(설치)을 VSC에서 시작하게된다.

 

11. Spring Boot를 실행하기위한 설치가 끝이 나면 내가 설정한 값들이 잘 적용되었는지 확인한다.

[Java JDK 버전 및 경로 확인]

[Maven Dependencies 다운로드 경로 확인]

경로가 제대로 잡혀있지 않다면, .m2~~폴더에 다운로드가 될 것이다.

 

[Maven Plugin 확인 ft.min10]

해당 plugin에 목록이 나오지 않고 JVM 에러가 나온다면, 경로문제 이거나 jdk 버전이 프로젝트에 설정되지 않아서이다.

 

12. 설치 완료 후 빌드 단축키 F5를 누르게되면 어떤 언어로 프로젝트를 실행할 것인지 물어본다.

13. JAVA를 선택 후 시간이 지나면 Spring Boot로 프로젝트를 실행한 것을 확인할 수 있다.

localhost:8080에 접속하게되면 에러 메세지가 있는 페이지를 확인할 수 있다. 

환경설정 끝...!

끝으로,,

jdk가 잘 먹지 않거나, 시스템 환경변수의 java 버전과 로컬 폴더에 설치한 java 버전이 충돌이 나는 경우가 많았다.

해결하는 추천방법은 처음부터 경로 설정 ~ 프로젝트 설정까지 다시 진행하는 것을 추천한다. 본인도 한참을 해메다가 

"maven.executable.path" 설정의 경로를 잘못잡은 것을 확인할 수 있었다.

 

이상 Spring Boot Project in VSC IDE 파일 만들기 블로그 작성을 끝낸다...!

Oracle에서 개발할 때 사용하는 함수들 중 NVL함수에 대해 활용법에 대해서 작성하려고 한다.

이전에는 NVL은 그냥 [NULL값을 치환해주는 함수]로만 생각하며 쿼리를 작성하였다.

 

[EX_1] 단순한 NVL함수 활용법 (NULL값 치환)

Table A 

TABLE A

SELECT

     NVL(CODE, '123') AS CODE,

     NAME

FROM A

 

실행 값

RESULT

※ 이렇게 NULL값을 채운다는 생각으로만 쓰였지만 

두 개 이상의 테이블을 조인할 때 좀 더 유용하게 NVL함수를 사용을 할 수 있다.

 

[EX_2]

 

TABLE A 
TABLE B

다음과 같이 두 개의 테이블을 조인하여 같은 회사(COMPANY_CD)에서 A.CODE 칼럼과 B.CODE_TYPE 칼럼을 서로 매칭 하여 B 테이블의 NULL값을 포함한 TIGON이라는 값을 얻으려고 할 때 NVL을 사용할 수 있다.

 

처음에는 NULL값이라서 매칭을 할 수 없는데 어떻게 결과값을 도출할 수 있을까 생각을 했었다.

SELECT 

    A.COMPANY_CD,

    B.TIGON

FROM A 

INNER JOIN B 

             ON A.COMPANY_CD = B.COMPANY_CD

            AND A.CODE = NVL(B.CODE_TYPE, A.CODE)

 

 

이상.

Non EQUI(비등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용된다. Non EQUI JOIN의 경우에는 “=” 연산자가 아닌 다른(Between, >, >=, <, <= 등) 연산자들을 사용하여 JOIN을 수행하는 것이다. 두 개의 테이블이 PK-FK로 연관관계를 가지거나 논리적으로 같은 값이 존재하는 경우에는 “=” 연산자를 이용하여 EQUI JOIN을 사용한다. 그러나 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에는 EQUI JOIN을 사용할 수 없다. 이런 경우 Non EQUI JOIN을 시도할 수 있으나 데이터 모델에 따라서 Non EQUI JOIN이 불가능한 경우도 있다.

 

Non EQUI 조인을 위해 테이블 생성과 값을 입력해보자.

 

1) EMP 사원 테이블 생성

 

 CREATE TABLE "EMP" 
   ( "ENAME" VARCHAR2(10 BYTE), 
     "DEPTNO" VARCHAR2(10 BYTE), 
     "HIREDATE" DATE, 
     "SAL" NUMBER, 
     "MGR" VARCHAR2(10 BYTE)
   )

 

Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('유재석','1001',to_date('19/06/07','RR/MM/DD'),3000000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('이휘재','1001',to_date('19/02/04','RR/MM/DD'),550000,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('박명수','1001',to_date('19/01/22','RR/MM/DD'),6000000,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('강호동','1001',to_date('16/04/14','RR/MM/DD'),7000000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('하동훈','1001',to_date('18/01/22','RR/MM/DD'),1956000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('노홍철','1001',to_date('18/08/28','RR/MM/DD'),1652000,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('길',

'1001',to_date('17/07/24','RR/MM/DD'),1564000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('정형돈','1001',to_date('11/01/21','RR/MM/DD'),1686000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('정준하','1001',to_date('12/02/12','RR/MM/DD'),6910000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('김제동','1001',to_date('13/11/13','RR/MM/DD'),5100000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('이경규','1001',to_date('14/10/10','RR/MM/DD'),3150000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('은지원','1001',to_date('19/04/14','RR/MM/DD'),4150000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('장성규','1004',to_date('19/05/25','RR/MM/DD'),8131000,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('이수근','1002',to_date('19/08/08','RR/MM/DD'),5110300,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('이효리','1002',to_date('19/09/14','RR/MM/DD'),6102100,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('이상순','1002',to_date('13/12/12','RR/MM/DD'),2345000,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('아이유','1002',to_date('11/11/22','RR/MM/DD'),2351100,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('박준형','1002',to_date('15/05/21','RR/MM/DD'),1681000,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('김태우','1002',to_date('16/06/26','RR/MM/DD'),2360000,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('데니안','1004',to_date('11/10/04','RR/MM/DD'),9042000,'2233');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('손호영','1003',to_date('17/07/27','RR/MM/DD'),5141000,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('데프콘','1003',to_date('19/07/24','RR/MM/DD'),5410000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('김태호','1003',to_date('19/02/24','RR/MM/DD'),3211000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('양세형','1003',to_date('19/03/24','RR/MM/DD'),2130000,'0011');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('조세호','1002',to_date('19/01/24','RR/MM/DD'),5050000,'8899');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('유병재','1004',to_date('19/02/24','RR/MM/DD'),6200000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('박수홍','1002',to_date('19/12/24','RR/MM/DD'),2130000,'7788');
Insert into EMPSET (ENAME,DEPTNO,HIREDATE,SAL,MGR) values ('조용필','1001',to_date('19/06/24','RR/MM/DD'),null,'7788');

 

 

사원 테이블

 

2) SALGRADE 월급 등급 테이블 생성

 

  CREATE TABLE "SALGRADE" 
   ( "GRADE" CHAR(1 BYTE), 
     "LOSAL" NUMBER, 
     "HISAL" NUMBER
   )

 

Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('1',500000,700000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('2',700001,1500000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('3',1500001,2500000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('4',2500001,5000000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('5',5000001,8000000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values ('6',8000001,10000000);

 

월급 등급 테이블

 

테이블 컬럼 값을 확인해보면 알겠지만 EQUI JOIN과는 다르게 동일한 칼럼값이 두 개의 테이블에서 존재하지 않는다. 이렇게 동일한 칼럼값이 없는 테이블에는 EQUI JOIN이 아닌 Non-EQUI JOIN문을 사용해야한다.

 

이제 테이블을 생성 하였으니 Non-EQUI JOIN문을 실행시켜보자.

질문은 다음과 같다. 먼저 질문에 해당하는 쿼리문을 고민해보고 답을 확인하는 것을 추천한다.

어떤 사원이 받고 있는 급여가 어느 등급에 속하는 등급인지 알아보자.

 

 

SELECT E.ENAME, E.SAL, S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

 

Non-EQUI JOIN 결과값

 

다음 쿼리문과 같이 Non-EQUI JOIN은 BETWEEN이나 부등호 수식이 들어간 JOIN문을 Non-EQUI JOIN이라고 할 수 있다. 

 

사원(EMP) 테이블에서 사원들의 급여가 급여등급(SALGRADE) 테이블의 등급으로 표시되기 위해서는 “=” 연산자로 JOIN을 이용할 수가 없다.

 

참고로 BETWEEN a AND b와 같은 SQL 연산자 뿐만 아니라 “=” 연산자가 아닌 “>”나 “<”와 같은 다른 연산자를 사용했을 경우에도 모두 Non EQUI JOIN에 해당한다. 단지 BETWEEN SQL 연산자가 Non EQUI JOIN을 설명하기 쉽기 때문에 예를 들어 설명한 것에 불과하며, 데이터 모델에 따라서 Non EQUI JOIN이 불가능한 경우도 있다.

 

 

 

출처 : http://www.dbguide.net/db.db?cmd=view&boardUid=148197&boardConfigUid=9&categoryUid=216&boardIdx=134&boardStep=1

'SQL' 카테고리의 다른 글

[SQL] EQUI JOIN  (0) 2019.07.31

SQL에서 JOIN이란 하나의 테이블에서 데이터를 조회 하는 것이 아닌 두 개 이상의 테이블과 연결 또는 결합하여 데이터를 출력하는 경우 사용하는 기능이다. 

일반적으로 프로젝트를 경험하게 되면 상당수의 SQL문들이 JOIN으로 이루어져 있다. JOIN은 관계형 데이터 베이스에서 가장 큰 장점이면서 핵심적인 기능이라고 말할 수 있다.
일반적인 경우 행들은 PRIMARY KEY(PK) 와 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립되지만 관계가 없는 경우에도 논리적인 값들의 연관만으로 JOIN이 성립될 수 있다.

 

EQUI JOIN을 하기전에 JOIN을 위해서는 두 개 이상의 테이블이 존재해야한다. 먼저 JOIN에 필요한 테이블을 생성한다.

테스트 DB서버가 있다면 DDL과 DML을 입력하여 테이블을 구성한 후 직접 JOIN문을 실행해보는 것을 추천한다.

 

1. 선수 테이블 (PLAYER)

 

  CREATE TABLE "PLAYER" 
    ( "PLAYER_ID" CHAR(7 BYTE), 
      "PLAYER_NAME" VARCHAR2(20 BYTE), 
      "TEAM_ID" CHAR(3 BYTE), 
      "E_PLAYER_NAME" VARCHAR2(40 BYTE), 
      "NICKNAME" VARCHAR2(30 BYTE), 
      "JOIN_YYYY" CHAR(4 BYTE), 
      "POSITION" VARCHAR2(10 BYTE), 
      "BACK_NO" NUMBER(2,0), 
      "NATION" VARCHAR2(20 BYTE), 
      "BIRTH_DATE" DATE, 
      "SOLAR" CHAR(1 BYTE), 
      "HEIGHT" NUMBER(3,0), 
      "WEIGHT" NUMBER(3,0)
   );

 

Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002007','박지성','K07',null,'Two Heart',null,'MF',7,'대한민국',null,null,191,73);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002010','이청용','K05',null,'BlueDragon','2002','MF',17,'몽골',null,'1',180,69);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002011','조현우','K06',null,'빛현우','2002','GK',1,'루마니아',null,'1',185,64);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002017','기성용','K07',null,'용용','2004','MF',14,'브라질',null,null,181,72);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002030','손흥민','K05',null,'SON','2010','AMC',7,'콜롬비아',null,null,178,79);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002031','김민재','K05',null,'KIM','2012','DF',7,'중국',null,null,193,83);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2005008','이승우','K08',null,'날쌘돌이','2002','ST',10,'대한민국',null,null,171,73);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2000011','안정환','K05',null,'반지',null,null,13,'대한민국',null,null,171,80);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2004012','황선홍','K08',null,'황소','2002','ST',11,'대한민국',null,null,178,73);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2001022','설기현','K01',null,'설','2002','ST',15,'대한민국',null,null,176,77);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2002033','이천수','K13',null,'번개','2002','MF',2,'대한민국',null,null,183,80);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2003004','황희찬','K14',null,'황','2002','MF',3,'대한민국',null,null,187,81);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2005002','이강인','K15',null,'유망주','2002','MF',94,'대한민국',null,null,188,83);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('1002341','박주호','K01',null,'슈퍼맨','2002','DF',19,'대한민국',null,null,183,81);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('1234151','김승규','K11',null,'김','2002','GK',21,'대한민국',null,null,179,60);
Insert into PLAYER (PLAYER_ID,PLAYER_NAME,TEAM_ID,E_PLAYER_NAME,NICKNAME,JOIN_YYYY,POSITION,BACK_NO,NATION,BIRTH_DATE,SOLAR,HEIGHT,WEIGHT) values ('2019292','이재성','K09',null,'이','2002','DF',23,'대한민국',null,null,182,89);

 

 

2. 팀 테이블 (TEAM)

 

CREATE TABLE "TEAM" 
    ( "TEAM_ID" VARCHAR2(3 BYTE), 
    "TEAM_NAME" VARCHAR2(20 BYTE), 
    "REGION_NAME" VARCHAR2(10 BYTE), 
    "STADIUM_ID" VARCHAR2(5 BYTE)
    );

 

 

Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K03','스틸러스','포항','C06');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K05','현대모터스','전북','D03');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K08','일화천마','성남','B02');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K07','드래곤즈','전남','D01');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K09','FC서울','서울','B05');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K04','유나이티드','인천','B01');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K11','경남FC','경남','C05');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K01','울산현대','울산','C04');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K02','삼성블루윙즈','수원','B04');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K12','광주상무','광주','A02');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K06','아이파크','부산','C02');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K13','강원FC','강원','A03');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K14','제주FC','제주','A04');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K15','대구FC','대구','A05');
Insert into TEAM (TEAM_ID,TEAM_NAME,REGION_NAME,STADIUM_ID) values ('K10','시티즌','대전','D02');   

 

 

 

3. 경기장 테이블 (STADIUM)

 

CREATE TABLE "STADIUM" 
    ( "STADIUM_ID" VARCHAR2(5 BYTE), 
    "STADIUM_NAME" VARCHAR2(40 BYTE), 
    "SEAT_COUNT" NUMBER, 
    "HOMETEAM_ID" VARCHAR2(4 BYTE), 
    "HOMECHECK" VARCHAR2(4 BYTE)
    );

 

 

Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('D03','전주월드컵경기장',28000,'K05','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('B02','성남종합운동장',27000,'K08','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('C06','포항스틸야드',25000,'K03','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('D01','광양전용경기장',20009,'K05','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('B05','서울월드컵경기장',66806,'K09',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('B01','인천월드컵경기장',35000,'K04','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('C05','창원종합운동장',27085,'K01',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('C04','울산문수경기장',46102,'K01',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('D02','대전월드컵경기장',41000,'K10','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('B04','수원월드컵경기장',50000,'K02','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('A02','광주월드컵경기장',40245,'K12',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('C02','부산아시아드경기장',30000,'K06','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('A03','강릉종합경기장',30000,'K13',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('A04','제주월드컵경기장',42256,'K14',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('A05','대구월드컵경기장',66422,'K15',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('F01','대구시민경기장',30000,'K15','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('F02','부산시민경기장',30000,'K06',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('F03','일산경기장',20000,'K09','HOME');
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('F04','마산경기장',20000,'K02',null);
Insert into STADIUM (STADIUM_ID,STADIUM_NAME,SEAT_COUNT,HOMETEAM_ID,HOMECHECK) values ('F05','안양경기장',20000,'K02','HOME');


기본 PK FK 관계는 
    1) PLAYER.TEAM_ID (PK) => TEAM.TEAM_ID (FK) 
    2) TEAM.STADIUM_ID (PK) => STADIUM.STADIUM_ID (FK) 

관계가 성립되어야 하지만 원할한 조인을 위해 PK FK 관계설정은 생략하였다.

 

 

테이블을 생성하였으니 EQUI JOIN에 대해 알아보고 JOIN문을 실행시켜보자.

 

EQUI(등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 대부분 PK ↔ FK의 관계를 기반으로 한다. 그러나 일반적으로 테이블 설계 시에 나타난 PK ↔ FK의 관계를 이용하는 것이지 반드시 PK ↔ FK의 관계로만 EQUI JOIN이 성립하는 것은 아니다.

JOIN의 조건은 WHERE 절에 기술하게 되는데 “=” 연산자를 사용해서 표현한다.

 

즉, EQUI JOIN은 두 개의 테이블에 값이 일치하는 데이터가 존재하는 칼럼을 기준으로 각 테이블에 대한 데이터를 조회하는 것이라고 할 수 있다.

 

PLAYER 테이블
TEAM 테이블

위 2개의 테이블에는 TEAM_ID라는 칼럼안에 같은 데이터들이 존재한다. 이렇게 같은 데이터를 비교하여 서로 다른 2개의 테이블의 정보를 조회하는 것을 EQUI조인이라고 할 수 있다.

 

 

이제 JOIN문을 실행시켜보자.

예졔) 선수 테이블과 팀 테이블을 조인하여 선수이름, 백넘버, 팀이름, 팀 연고지를 조회하시오.

 

 

 

EQUI JOIN을 할 수있는 방법은 2가지 방법이 있다.

 

1) JOIN이라는 명령문을 EQUI JOIN

SELECT
     A.PLAYER_NAME,
     A.BACK_NO,
     A.TEAM_ID,
     B.TEAM_NAME,
     B.REGION_NAME
FROM
     PLAYER A ,
     TEAM B
WHERE
     A.TEAM_ID = B.TEAM_ID;

 

2) INNER JOIN 명령문을 기재한 EQUI JOIN

SELECT
     A.PLAYER_NAME,
     A.BACK_NO,
     A.TEAM_ID,
     B.TEAM_NAME,
     B.REGION_NAME
FROM
     PLAYER A INNER JOIN TEAM B 

ON

     A.TEAM_ID = B.TEAM_ID;

 

참고로

WHERE 과 ON 절은 서로 다른 의미를 가지고 있지만 위의 예시에서는 같은 역할을 한다고 생각하면 된다.

추후에 WHERE과 ON의 차이점에 대해서 포스팅하도록 하겠다.

 

 

실행을 시키게 되면 TEAM_ID라는 공통칼럼을 기준으로 PLAYER 테이블에 존재하는 PLAYER_NAME, BACK_NO 데이터와 TEAM 테이블에 존재하는 TEAM_NAME, REGION_NAME 데이터를 한 결과창에서 확인할 수 있다.

 

 

 

'SQL' 카테고리의 다른 글

[SQL] Non EQUI JOIN  (0) 2019.08.05

1. Vue.js 설치 및 프로젝트 생성

 

1-1) Vue.js 프로젝트를 생성할 Workspace 폴더를 지정한다.

cmd창을 열어 해당 Workspace 폴더에 vue-cli를 설치한다. 

- npm install –g vue-cli

 

1-2) vue-cli를 설치 후 vue 프로젝트를 생성한다.

- vue init webpack vueclient #vue webpack

프로젝트 정보 및 추가기능 유무를 입력하는 항목이 나온다.

- Vue-router web 통신을 하는데 필수적인 요소이므로 Yes를 선택한다.

- ESLint는 공통 개발을 할 때 코드의 가독성을 높여주는 기능이다. ESLint는 코드의 들여쓰기나

공백 등을 검사 해주는 기능이다.

- unit-tests는 단위검사로 Vue의 컴포넌트를 테스트할 때 사용된다.

- Nightwatch는 각종 브라우저를 조작하고 동작이 기대한 것과 일치하는지 테스트할 때 사용된다.

- 사실상 Vue-router 기능이 핵심이므로 Vue-roter는 함께 설치하도록 한다.

 

- 설치 후 해당 프로젝트로 이동하여 프로젝트를 실행.

- cd vueclient

- npm run dev

 

1-3)localhost:8082에 접속한다.

- 다음과 같은 페이지가 나오면 프로젝트를 성공적으로 생성하였다.

 

Vue.js 의 기능과 추가 설명은 추후에 진행하겠습니다.

CREATE SEQUENCE TABLENAME_SEQ  -- 시퀀스 이름
START WITH 1  -- 시퀀스 값 1부터
INCREMENT BY 1 -- 1씩증가
NOMAXVALUE  -- 시퀀스의 범위를 무한대(9999999999999999999999999999)로 지정
NOCACHE; -- 캐시값 없애기

 

[NOCACHE]

- ORACLE에서 시퀀스를 생성하면 시퀀스의 값을 1~20까지 캐시값으로 미리 만든다.

이렇게 미리 캐시값으로 시퀀스 값이 미리 생성이 된 후 서버에 다시 접속을 하게되면 1 다음에 2가 아닌 21라는 값으 로 시퀀스가 생성된다. 이를 방지하기 위하여 NOCAHE라는 명령어로 캐시값을 지정하지 않고 1부터 차례대로 시퀀스 값을 생성할 수 있다.

 

'SQL > ORACLE' 카테고리의 다른 글

Oracle NVL 함수 활용  (0) 2021.04.15
[ORACLE] 달러 환율 및 원화 구하기  (0) 2019.07.18

SELECT TO_CHAR(5000/1182,'$999,999,999.99') 환율달러,  
TO_CHAR(5000,'L999,999,999') 원화 FROM DUAL;

 

'SQL > ORACLE' 카테고리의 다른 글

Oracle NVL 함수 활용  (0) 2021.04.15
[ORACLE] 값 하나씩 올라가는 시퀀스 생성하기  (0) 2019.07.18

- oracle DataBase를 사용하기 위해서 해당 프로젝트에 oracledb를 설치.

- 기존에 만들어 둔 express 프로젝트 폴더로 이동하여 다음 명령어를 실행.

1-1) npm install –-save oracledb

- 해당 프로젝트의 package.json 파일에 oracledb가 정상적으로 설치되었는지 확인.

본인은 VSC라는 Edit Tool을 사용했다. 

 [비고] VSC (Visual Studio Code) Editor 설치

- Node를 사용할 Editor가 필요하다. 개인 성향에 맞는 Editor를 설치하거나 사용하면 되지만 Node를 가장 보편적으로 사용하는 Editor VSC이다.

- 설치 URL : https://code.visualstudio.com/

 

1-2) C ++을 지원하는 C컴파일러 설치.

- Window 사용자는 Visual Studio 2015 Version이 필요

- 설치 경로 :

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

 

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

Cookies are disabled Please enable cookies and refresh the page

support.microsoft.com

 

1-3) Python 설치

- node-oracledb를 컴파일 하기 위해 필요.

- 설치 경로 :

https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

- C컴파일러와 Python을 설치하는 이유는 Oracledb Libray가 C언어와 Python언어로 만들어진 영역이 있기 때문에 필수적으로 설치가 필요하다.

 

1-4) 오라클 인스턴트 클라이언트 다운

- 운영체제에 맞는 라이브러리 경로에 Oracle 클라이언트 라이브러리를 추가.

- 다운 경로 :

https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html

 

Oracle Instant Client Downloads

 

www.oracle.com

- Oracle 버전에 맞는 instantclient-basic-windows.x64, instantclient-sdk-windows.x64 Basic, sdk를 각각 다운.

 

- zip 파일로 된 두 개의 인스턴스 파일들을 하나의 폴더에 압축 해제.

 

1-5) 환경변수

   - 다운받은 두 개의 Oracle 인스턴스 파일들을 환경변수에 지정.

   - sdk 경로를 basic 경로 위에 지정.

 

1-6) 프로젝트 WorkSpace 폴더에 환경변수 지정.

  - oracledb를 사용할 프로젝트들이 있는 폴더에 cmd창을 이용해서 환경변수를 다시 지정.

  - sdk가 설치된 경로와 sdk 폴더 안의 include 폴더의 경로를 지정.

(본인은 myapp폴더에 환경변수를 지정 하였지만 상위폴더인 node_workspace에 지정하여도 무방합니다.)

set OCI_LIB_DIR=D:\oracle\instantclient\instantclient-sdk-windows.x64-18.3.0.0.0dbru\instantclient_18_3\sdk

 

set OCI_LIB_DIR=D:\oracle\instantclient\instantclient-sdk-windows.x64-18.3.0.0.0dbru\instantclient_18_3\sdk

\include

 

set OCI_LIB_DIR=(해당 경로)

 

1-7) 설치 완료 후 테스트

 - oracledb Example 경로:  https://github.com/oracle/node-oracledb

 

oracle/node-oracledb

Oracle Database driver for Node.js maintained by Oracle Corp. - oracle/node-oracledb

github.com

 - 해당 경로에 들어가서 예제를 다운.

 - examples 폴더 안에 js파일들을 위에서 생성한 Express 프로젝트 폴더에 이동.

 

- dbconfig.js 파일을 열어 접속할 User, Passowrd, ip주소 정보를 입력.

- 정보 입력 후 connect.js 를 실행시키면 Connection was successful! 출력 확인.

 

1-8) 참고

- oracleDB 설치 가이드 URL:

https://oracle.github.io/node-oracledb/INSTALL.html#quickstart

 - oracleDB 함수 및 가이드: https://oracle.github.io/node-oracledb/doc/api.html

 - oracleDB 설치 (Window) 방법 Youtube URL:

https://www.youtube.com/watch?v=I23XTkUMrtM

 

잘 설치가 되었다면 공감 부탁드립니다.

'Node.js' 카테고리의 다른 글

Node Express 서버 프로젝트 생성하기.  (0) 2019.07.11
Node.js 설치 방법 (Window 64Bit)  (0) 2019.06.07

+ Recent posts