네이버클라우드 AIaaS 개발자 양성과정 1기/Java

[비트캠프] 37일차(8주차2일) - Java(gradle 디렉토리 구조와 사용, Eclipse IDE 준비, 소스 및 class 파일)

끈기JK 2022. 12. 27. 13:12

 

Maven 빌드 도구의 표준 프로젝트 디렉토리 구조

 

 

gradle 파일을 포함한 구조는 다음과 같다.

  • bundle.gradle : Gradle 빌드 스크립트 파일. 빌드 설정 파일, groovy 프로그래밍 언어로 작성
  • settings.gradle : Gradle 빌드 보조 스크립트 파일. 하위 프로젝트 설정 및 공통 설정 정보
  • gradle/ : Gradle 프로그램을 local에 설치해주는 도우미 프로그램
  • gradlew.bat : gradle/ 폴더에 들어있는 설치 프로그램을 실행하여 gradle을 설치하고 설치한 gradle을 사용해서 gradle 명령을 실행하는 shell 프로그램
  • gradlew : Unix / Linux / macOS 용
  • .gradle/ : gradle 도구가 작업하는 동안 사용하는 임시 폴더

 

// bundle.gradle 예시

// gradle 빌드 도구에 플러그인 장착
plugins {
    // 자바 소스를 컴파일할 때 사용할 도구를 추가한다.
    // 뿐만 아니라 eclipse 플러그인과 결합해서
    // eclipse IDE의 자바 관련 설정 파일을 생성할 때도 사용한다.
    // 예) .classpath, .settings/*
    id 'java'  

    // 이클립스 관련 파일을 다룰 때 사용할 도구를 추가한다.
    // 예) .project
    id 'eclipse' 
}

// 자바 소스를 컴파일 할 때 적용할 옵션

tasks.withType(JavaCompile) {
    // 프로젝트의 소스 파일 인코딩을 gradle에게 알려준다.
    // $javac -encoding UTF-8 ..
    options.encoding = 'UTF-8' 

    // 소스 파일을 작성할 때 사용할 자바 버전
    sourceCompatibility = '17'

    // 자바 클래스를 실행시킬 JVM의 최소 버전
    targetCompatibility = '17'
}


// .class 파일을 둘 폴더를 지정하지 않으면 
// Gradle 은 기본 출력 폴더의 경로로 'bin/default' 를 사용한다.
// 
// 그러나 이클립스 설정 파일을 만드는 과정에서 
// 각 소스 경로에 대한 기본 출력 폴더가 bin/main 으로 따로 설정되어 있다.
// 그래서 실제 자바 소스 파일을 컴파일하면 bin/default 가 아니라 
// bin/main 폴더에 .class 파일이 저장된다.
// 
/*
eclipse {
	classpath {
        defaultOutputDir = file('myokok')
        
		file {
        	whenMerged { 
    	    	// use default Output for all source-folders. see also defaultOutputDir per project
	        	entries.each { source ->
					if (source.kind == 'src' && !source.path.startsWith('/')) { // only Source-folders in the project starting with '/' are project-references
						source.output = null
        			}
				}
    	    }
	    }
        
	}
}
*/

// eclipse 프로젝트 이름을 설정하기
eclipse {
    project {
        name = "eomcs-java-lang"
    }
    jdt {
      sourceCompatibility = 17
      targetCompatibility = 17
      javaRuntimeName = "JavaSE-17"
    }
}


// 프로젝트에서 사용할 자바 라이브러리를 다운로드 받을 때 접속할 서버
repositories {
    mavenCentral()
}

// 프로젝트에서 사용할 자바 라이브러리 목록
dependencies {
  // Spring IoC 컨테이너
  // implementation 'org.springframework:spring-context:5.3.13'

  // @Resource 애노테이션이 들어 있는 API
  // implementation 'javax.annotation:javax.annotation-api:1.3.2'

  // Spring JDBC 보조 라이브러리
  // - DataSource 구현체가 들어 있다.
  // implementation 'org.springframework:spring-jdbc:5.3.13'

  // Apache commons-dbcp 라이브러리
  // - DataSource 구현체가 들어 있다.
  // implementation 'commons-dbcp:commons-dbcp:1.4'
   
  // Reflection API를 좀 더 쉽게 사용하게 도와주는 유틸리티
  //implementation 'org.reflections:reflections:0.9.12'

  // Mybatis 퍼시스턴스 프레임워크
  // implementation 'org.mybatis:mybatis:3.5.7'

  // Mybastis를 Spring과 연동할 때 사용할 라이브러리
  // implementation 'org.mybatis:mybatis-spring:2.0.6'

  // MariaDB JDBC 드라이버
//   implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.7'

  // Oracle JDBC Driver
//   implementation 'com.oracle.database.jdbc:ojdbc11-production:21.7.0.0'
    
  // MSSQL JDBC Driver
//   implementation 'com.microsoft.sqlserver:mssql-jdbc:11.2.0.jre17'
  
  // Google JSON 라이브러리
  // implementation 'com.google.code.gson:gson:2.8.9'
  
  // jackson-databind JSON 라이브러리
  // implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.1'

  // Apache HTTP 통신 라이브러리
  //implementation 'org.apache.httpcomponents.client5:httpclient5:5.0'
  //implementation 'org.apache.httpcomponents.client5:httpclient5-fluent:5.0'

  // AOP 라이브러리
  // implementation 'org.aspectj:aspectjweaver:1.9.9.1'

  // log4j 2.x 라이브러리
  // implementation 'org.apache.logging.log4j:log4j-core:2.14.1'

  // Use JUnit test framework.
  testImplementation 'junit:junit:4.13.2'

  // This dependency is used by the application.
  implementation 'com.google.guava:guava:31.1-jre'
}

 

// settings.gradle 예시

rootProject.name = 'backend-app'
include('app')

 

 

유닉스는 확장자 개념이 없고 이름 전체가 하나의 파일 이름이다.

유닉스(맥, 리눅스)에서 현재 폴더에 실행하려면 ./ 를 입력해야 한다.

PS C:\Users\bitcamp\git\bitcamp-ncp\boot-app> ./gradlew -q run

 

윈도우는 아래와 같이 적으면 gradlew.com → gradlew.exe → gradlew.bat 순으로 파일 찾아보고 있으면 실행한다.

없으면 PATH에 나와있는 경로에서 위 3개 파일 찾아보고 없으면 다음 폴더로 가서 찾아보는 과정을 끝까지 진행한다.

PS C:\Users\bitcamp\git\bitcamp-ncp\boot-app> gradlew -q run

 

 

Web Browser에서 데이터 요청하는 예제

서버 실행시킨 상태에서 데이터 가져온다.

// ex07\exam05-18c.html

    <table border="1">
        <thead>
            <tr>
                <th>번호</th>
                <th>제목</th>
                <th>작성자</th>
                <th>조회수</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
    <button id="btn1">데이터 가져오기!</button>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script>
        "use strict"
        var tbody = $("tbody");

        $("#btn1").click(() => {
            $.getJSON("http://localhost:8080/boards", (result) => {
                result.forEach((b) => {
                    $("<tr>")
                        .html("<td>" + b.no + "</td>" +
                            "<td>" + b.title + "</td>" +
                            "<td>" + b.writer + "</td>" +
                            "<td>" + b.viewCnt + "</td>")
                        .appendTo(tbody);
                });
            });
        });

app.java에 Board 부분을 추가한다.

@CrossOrigin을 추가하지 않으면 CORS 정책 위반으로 데이터 가져오지 못한다.

// boot-app\app\src\main\java\bitcamp\bootapp\App.java

import org.springframework.web.bind.annotation.CrossOrigin;

@CrossOrigin("*")


public class App {

  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }

  @GetMapping("/hello")
  public String hello() {
    return "Hello, world!";
  }

  static class Board {
    int no;
    String title;
    String writer;
    int viewCnt;

    public Board(int n, String t, String w, int v) {
      this.no = n;
      this.title = t;
      this.writer = w;
      this.viewCnt = v;
    }

    public int getNo() {
      return this.no;
    }

    public String getTitle() {
      return this.title;
    }

    public String getWriter() {
      return this.writer;
    }

    public int getViewCnt() {
      return this.viewCnt;
    }
  }

  @GetMapping("/boards")
  public Object boards() {
    Board[] arr = {
        new Board(1, "제목1", "홍길동", 101),
        new Board(2, "제목2", "홍길동2", 1011),
        new Board(3, "제목3", "홍길동3", 121),
        new Board(4, "제목4", "홍길동4", 401),
        new Board(5, "제목5", "홍길동5", 601)
    };
    return arr;
  }
}

 

VSCode에서 작업 영역에 git 폴더 자체를 추가하면 코드 작성시 문구 추천 및 자동 import 안되는 경우가 있다.

필요한 폴더만 작업 영역에 추가해서 진행하니 해결되었다.

 

 

 

Java 학습 진행 방향

 

Java 학습을 위해 4가지 폴더를 사용한다.

  • eomcs-java-lang : 학습 교재
  • myapp : 문법 응용 실전 프로젝트
  • backend-app : 과제용 백엔드 프로그래밍
  • frontend-app : 과제용 프론트엔드 프로그래밍

 

C:\Users\bitcamp\git\bitcamp-ncp\ 에 eomcs-java-lang 폴더 복붙한다.

 

폴더 이름 변경 : boot-app → backend-app

settings.gradle 도 이름 변경한다.

 

myapp 폴더 생성 후 gradle init 한다.

PS C:\Users\bitcamp\git\bitcamp-ncp> mkdir myapp
PS C:\Users\bitcamp\git\bitcamp-ncp> cd .\myapp\
PS C:\Users\bitcamp\git\bitcamp-ncp\myapp> gradle init

이후 gradle 명령어 사용 가능하다.

 

 

 

이클립스 IDE 사용 준비

 

Eclipse 세부 설정 : eomcs-docs\devtool-userguide\jdk-eclipse-settings.md 참조

## 기본 Java IDE 'Eclipse IDE' 설치  
- eclipse.org 에서 다운로드하여 설치
- 이클립스 실행 할 때 workspace 폴더 선택 
    - 예) /home/사용자홈/eclipse-workspace
- workspace 설정
  - 워크스페이스 폴더 마다 설정해야 한다.
  - 즉 워크스페이스 폴더를 새로 지정하면 설정도 새로 해야 한다.
  - 메뉴 / Windows / Preferences 클릭 
  - 1) General/Apearance/Colors and Fonts
    - Basic/Text Font를 자신의 취향에 맞춰 설정한다.
  - 2) General/Editors/Text Editors
    - Displayed tab width : 2
    - Insert spaces for tabs 체크
      - Remove multiple spaces on backspace/delete
    - Show print margin 체크 
      - print margin column : 100
    - Show white space characters 체크
      - configure visibility 링크 클릭 
        - 스페이스 문자가 삽입된 것을 표시.
        - 엔터키(CR/LF) 입력 표시하지 말 것
        - 투명도(transparency level) : 30
  - 3) General/Workspace
    - Text file encoding을 UTF-8로 설정할 것.
    - New text file line delimiter를 Unix 방식으로 설정할 것.
  - 4) Java/Code Style/Formatter
    - Eclipse java google style 포맷터 다운로드
      - https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml
    - Active profile 에서 구글 스타일 포맷터 임포트하기
  - 5) Java/Editor/Save Actions
    - Performed selected action.. 체크
      - Additional actions 체크
        - Configure 버튼 클릭
        - Code Organizing 탭/Correct Indentation 체크
  - 6) Java/Installed JRE
    - JDK 홈 폴더가 등록되어 있지 않았다면 추가한다.
  - 7) Web
    - CSS Files : Encoding을 UTF-8로 설정한다.
    - HTML Files : Encoding을 UTF-8로 설정한다.
    - JSP Files : Encoding을 UTF-8로 설정한다.

 

 

 

Eclipse IDE 와 프로젝트

 

Eclipse IDE 실행을 위한 폴더 구조는 이와 같다.

Eclipse에서 Project 에 import 하려면 Eclipse IDE 설정파일인 .project, .classpath, .settings 폴더가 있어야 한다.

해당 파일은 gradle 명령어로 자동 생성 가능하다.

  • .project : 프로젝트 정보
  • .classpath : 의존 라이브러리
  • .settings : IDE 설정파일

 

 

 

Gradle 빌드 도구

 

build.gradle 파일을 build script file(빌드 도구의 설정 정보)라 한다.

이 파일에 plugins 에 id '플러그인 ID' 로 플러그인 등록한다.

이 파일이 Gradle을 load 하는데 default tasks로 init, projects, wrapper, tasks, ... 이 있다.

java plugin 장착하면 해당 명령어 사용 가능하다.

eclipse plugin 장착하면 해당 명령어 사용 가능하다.

 

 

명령 프롬프트에서 사용하는 gradle 명령어는 다음과 같다.

# gradle이 현재 할 수 있는 일 모두 보여줌
PS C:\Users\bitcamp\git\bitcamp-ncp\eomcs-java-lang> gradle tasks --all

# projects 현황 보여줌
PS C:\Users\bitcamp\git\bitcamp-ncp\eomcs-java-lang> gradle projects

# wrapper file 생성해줌( .gradle 폴더, gradle 폴더, gradlew, gradlew.bat)
PS C:\Users\bitcamp\git\bitcamp-ncp\eomcs-java-lang> gradle wrapper

# build 폴더 삭제
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle clean

# 프로그램을 .jar로 패키징. bulild > libs 에 생성됨
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle jar

 

gradle 명령어 java, eclipse 사용하려면 plusins 에 코드 추가한다.

id 'applicaton' 에 java 플러그인 포함되어 있으므로 id 'java' 별도 등록 필요 없다.

// app\build.gradle

plugins {
  // Eclipse IDE 관련 기능을 추가한다.
  id 'eclipse'
  
  // Gradle 에서 자바 애플리케이션을 실행시킬 수 있도록 기능을 추가한다.
  id 'application'  // java 플러그인 포함
  // id 'java'
}

 

plugins 에 eclipse 등록시 사용 가능한 명령어. Eclipse IDE 설정파일 생성 가능하다.

# app 폴더에 .project 파일(프로젝트 정보) 생성한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle eclipseProject

# app 폴더의 .project 파일 제거한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle cleanEclipseProject

# app 폴더에 .classpath 파일(의존 라이브러리) 생성한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle eclipseClasspath

# app 폴더의 .classpath 파일 제거한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle cleanEclipseClasspath

# app 폴더에 .settings 폴더 및 내부 파일(IDE 설정파일) 생성한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle eclipseJdt

# app 폴더의 .settings 폴더의 내부 파일 제거한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle cleanEclipseJdt

# app 폴더에 위 3가지 파일 모두 생성한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle eclipse

# app 폴더의 위 3가지 파일 모두 제거한다.
PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle cleanEclipse

 

plugins 에 application(or java)등록시 사용 가능한 명령어

PS C:\Users\bitcamp\git\bitcamp-ncp\backend-app> gradle compileJava

 

 

bin 은 VSCode 에 의해 생성되는 폴더이다. Eclipse로 잘 실행되다가 안되는 경우가 있는데 VSCode 실행시 java 파일을 모두 컴파일 해서 기존 Eclipse 폴더를 덮어쓰는 경우 에러 발생할 수 있어 주의해야 한다.

 

 

 

Eclipse 프로젝트 Import

 

Eclipse에서 import 하는 프로젝트의 이름이 기존 프로젝트와 동일하면 import 되지 않는다.

아래처럼 eclipse.project.name 에 설정한 이름으로 Eclipse에 import 되니 import 전에 수정한다.

또한 eclipse IDE 설정도 같이 한다.

// app\build.gradle

// 'eclipse' 플러그인 설정:
eclipse {

    // => eclipse 프로젝트 이름 설정하기
    project {
        name = "myapp"
    }

    // => eclipse IDE 설정하기
    jdt {
      sourceCompatibility = 17
      targetCompatibility = 17
      javaRuntimeName = "JavaSE-17"
    }
}

 

 

 

Java 문법

 

.java 와 .class, 컴파일

 

Java에서 class는 컴파일 최소 단위이다.

Test1.java 에 class A, B, C 가 있다. $ javac Test1.java 명령어로 컴파일 하면 각 class의 이름으로 파일 생성된다.

PS C:\Users\bitcamp\git\bitcamp-ncp\myapp> javac A.java

이렇게 하면 수천만 class를 유지보수 할때 힘들어져서 다음 방법을 쓴다.

 

 

 

class 블록과 소스 파일

 

한 개 파일에 class 블록 1개만 둔다. 유지 보수가 쉽도록 1 class 1 소스파일 사용한다.

class 이름과 파일 명을 동일하게 한다. 컴파일시 class 명과 동일한 파일명이 나온다.

하지만 소스 파일과 class 파일이 혼재하여 관리가 어려워 다음 방법을 쓴다.

 

 

 

소스 파일과 .class 파일 분리

 

배포 파일을 추출하는 등 관리가 쉽도록 분리

소스 파일과 class 파일 폴더를 구분하여 저장한다.

PS C:\Users\bitcamp\git\bitcamp-ncp\myapp> javac -d bin src/A.java src/B.java src/C.java

하지만 소스 파일을 카테고리로 분류하지 않아 효율적이지 못하다.

 

 

 

소스 파일과 디렉토리

 

여러개의 소스 파일을 관리하기 쉽도록 하위 디렉토리에 분류한다.

소스 파일은 카테고리 분류가 되었으나 class 파일은 분류가 되지 않았다.

 

 

 

소스 파일과 패키지

 

패키지 : 클래스 블록을 분류하기 위해 만든 문법

소스 파일을 한 폴더에 넣고 package 지정을 하면 class는 분류되나 소스 파일은 분류되지 않는다.

 

 

소스 파일을 찾기 쉽도록 소스 파일 또한 package 이름과 같은 폴더에 둔다.

 

 

 

패키지와 디렉토리

 

최종적으로 이와 같이 소스파일을 카테고리별 폴더에 분류하고 컴파일한 결과인 class 파일도 폴더별로 분류되도록 설정하는 것이 바람직하다.

 

 

관련 예제 참조

C:\Users\bitcamp\git\bitcamp-ncp\eomcs-java-lang\app\src\main\java\com\eomcs\lang\ex01\Exam0110.java

 

 main() 메서드

- 다음과 같이 JVM을 통해 클래스를 실행하면, JVM은 그 클래스에서 main() 메서드를 찾아 실행한다.
  예) $ java -cp bin/main com.eomcs.basic.ex01.Exam400
- main() 메서드가 없으면 실행 오류가 발생한다.
- 프로그램을 실행하는 시작점이라는 의미에서  "entry point" 라 부른다.

## JVM이 클래스를 실행하는 과정
1) 실행할 클래스 파일을 CLASSPATH에 등록된 디렉토리 경로에서 찾는다.
2) 클래스 파일이 유효한 바이트코드(bytecode) 인지 검사한다.
3) 메모리에 바이트코드를 적재(load)한다.
4) public static void main(String[] args) {} 블록을 찾는다.
5) main() 블록에 들어 있는 코드를 실행한다.

 

 


 

조언

 

*

 

 


 

과제

 

/