2021-11-29(월) 4주차 1일

프로젝트 폴더
이클립스 IDE에서 사용하는 프로젝트 폴더 구조
다른 IDE툴과 호환되지 않는다.
특정 개발 도구에 종속되지 않도록 표준 방식으로 프로젝트를 만들어야 됨

Maven 빌드 도구 ← 표준 구조
특정 IDE에 종속되지 않는 프로젝트 폴더 구조
소스파일과 컴파일된 파일이 섞여있으면 관리하기 힘듦

이클립스 전용 파일
.project : 프로젝트 설정 정보
.classpath : 외부 개발자가 제공하는 클래스 파일
.settings/ : 에디터 설정 정보

볶음밥 만들 때도 쌀은 다른 사람이 수확한 거 쓰고 식용유도 다른 사람이 만든 거 쓰고
자바에서 기본적으로 제공해주는 것도 쓰지만 다른 개발자가 만든 라이브러리를 가져다가 쓴다

다른 개발자, 다른 회사가 만든 코드를 가져와서 쓸 건데 그거에 대한 정보가 필요. 그 정보가 .classpath에 있음

.settings 폴더에는 에디터 설정에 대한 부가 정보가 들어 있다.

이클립스 IDE에서만 의미가 있는 파일들이고 다른 개발 도구에서는 의미가 없음

src 밑에 main과 test로 나뉨
main에는 소스코드
test는 소스코드를 제대로 짰는지 테스트하는 코드

main 아래에 java(소스 파일), resources(설정 파일), webapp(HTML, CSS, JS)
test 밑에 java, resources

컴파일 하면 bin 이라는 폴더가 생김
main 컴파일한 건 bin - main에 두고
test 컴파일한 건 test에 두고

빌드 도구라는 걸 써서 폴더 구조를 자동으로 만듦

나중에는 사용자에게 배포할 수 있도록 포장까지 해준다.

전세계적으로 Maven을 쓰고 있지만 안드로이드앱쪽은 Gradle을 많이 씀

Gradle로 Maven 표준 디렉토리를 생성함
Maven 호환
이 구조에 익숙하니까 굳이 Gradle이 독자적인 길을 걷지 않고 Maven이 사용하는 구조 그대로 사용함

① 프로젝트로 사용할 디렉토리 생성

mkdir java-lang

sample 프로그램까지 자동으로 생성

gradlew.bat

Gradle 설치할 필요 없어

gradlew 명령만 쓰면 됨

settings.gradle : 기본 세팅

app = main

gradle한테 eclipse 작업을 시키려면
eclipse 설정 파일을 만드는 일을 시키고 싶은 거임

매트릭스 헬기 조정

플러그인을 꼽아준다

이게 플러그인

자율 주행 - 기계 학습 - 머신 러닝 - 심화 학습(딥 러닝)
이런 규칙일 때는 이렇게 행동해라
인간이 계속 규칙을 넣어줘야 됨
다양한 상황에 대처할 수 없음
심화 학습
대량의 데이터를 집어 넣는 거
고양이 사진을 수천만개를 집어 넣음
개 사진 수천만개를 다 집어 넣음
스스로 규칙을 만듦
사람이 규칙을 넣어주는 게 아니라
딥 러닝의 핵심은 대량의 데이터
빅 데이터(대량의 데이터)

그 작업을 수행할 수 있도록 플러그인을 장착
gradle 설정파일인 build.gradle에서 plugins 수정

C:\Users\bitcamp\git\bitcamp-study\java-lang\app>gradle eclipse

eclipse가 인식하기 위해서는 3개의 파일 및 폴더가 필요

app 말고 java-lang

true에서 false로 바꾸기

C:\Users\bitcamp\git\bitcamp-study\java-lang\app>gradle eclipse

.project 파일 확인해보면 java-lang으로 되어 있음

이클립스에서 import
java-lang으로 되어 있음

Gradle과 플러그인

build.gradle
plugins
id 'java' : 자바 관련 작업을 수행할 수 있다.
id 'eclipse' : 이클립스 관련 설정 파일을 생성할 수 있다.

$ gradle 작업명
기본 작업 외에 특정 작업을 실행시키고 싶다면, 그 작업에 대한 명령어가 들어 있는 플러그인을 추가하라!

▣ Gradle과 플러그인의 관계를 설명할 수 있는가?
플러그인을 장착해야 작업을 실행시킬 수 있음. 마치 매트릭스에서 헬기 조정법을 익히는 것과 똑같다.

vscode 끄고 삭제하기

build.gradle 파일에 들어있는 정보를 참조해서 작업을 수행
build.gradle 파일을 변경하면 gradle eclipse 해서 반영해줘야 됨
자동으로 생성되는 파일은 수정하면 안 됨
build.gradle 파일이 있는 곳에서 실행해야 됨

Spring Boot 프로젝트 만들기

① 일반 애플리케이션

• 직접 기계어 파일을 실행하기
사용자가 명령창을 이용해 운영체제를 통해서 실행파일을 실행한다.

C:\Users\bitcamp>notepad.exe

기계어 파일을 실행할 때는 다른 도우미 프로그램에 필요 없다.

• 소스파일을 실행하기
사용자가 명령창을 이용해 운영체제를 통해서 node Hello.js
실행하는 건 node.exe를 실행하는 거
node.exe : 자바스크립트 엔진(인터프리터)
node.exe가 Hello.js 읽어서 실행

C:\Users\bitcamp\git\bitcamp-study>node.exe hello.js
Hello, world!

이게 소스파일을 직접 실행

• 자바 바이트코드 실행하기
사용자가 명령창을 이용해서
java.exe(JVM, Bytecode interpreter) 실행
Hello.class를 읽어서 OS를 통해서 실행한다.

C:\Users\bitcamp\git\bitcamp-study>javac Hello.java

C:\Users\bitcamp\git\bitcamp-study>java.exe Hello
Hello, world!

② Spring Boot 애플리케이션
명령창 대신 웹브라우저를 사용한다.

사용자는 웹 브라우저에서 http://localhost:8080/hello
JVM이 실행하고 있는 Spring Boot에게 요청을 보낸다.
스프링부트도 자바로 만들어졌기 때문에 JVM이 실행하는 거
스프링부트에 요청을 보낸다
.class 파일 메소드 호출
HelloController.class 메소드를 호출
메소드가 리턴을 함
명령창 대신 웹브라우저를 사용한다.
JVM을 직접 실행하여 바이트코드를 실행하는 대신 스트링부트가 대신 실행해준다.

Spring Boot는 내부에 웹 서버 기능이 있다는 거

기존 자바 프로젝트를 스프링부트 프로젝트로 전환하기

① build.gradle에 스프링부트 관련 설정을 추가한다.

https://spring.io/projects/spring-boot

스냅샷은 개발중인거

라이브러리 정보를 추가

GENERATE 다운 받는 거
EXPLORE

어떤 플러그인을 장착해야 되는지만 본다

plugins {
  id 'org.springframework.boot' version '2.6.0'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.eomcs'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
  useJUnitPlatform()
}

프로젝트에 대한 설정

group = 'com.eomcs'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

자바 11 버전까지만 호환되게 하겠다

다른 사람이 만든 라이브러리가 어디에 올라가 있느냐

# Getting Started

### Reference Documentation
For further reference, please consider the following sections:

* [Official Gradle documentation](https://docs.gradle.org)
* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.6.0/gradle-plugin/reference/html/)
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.6.0/gradle-plugin/reference/html/#build-image)
* [Spring Web](https://docs.spring.io/spring-boot/docs/2.6.0/reference/htmlsingle/#boot-features-developing-web-applications)
* [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/2.6.0/reference/htmlsingle/#using-boot-devtools)

### Guides
The following guides illustrate how to use some features concretely:

* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)

### Additional Links
These additional references should also help you:

* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)

Preview는 HTML로 만들어서 보여주는 거

이중구조

옛날에는 프로젝트가 하나였음
실무에서 프로젝트를 하다보니까 프로젝트가 한 개가 아니라
메인 프로젝트가 하나 있고, 메인을 보조하는 서브 프로젝트가 여러 개 있을 수 있음
전체가 하나의 프로젝트임
서브 프로젝트가 여러 개 있는 걸 고려해서 이런 구조로 바꿈
gradle 7.대 버전부터 바뀜

application.properties 파일 만들기
application에 관련된 설정 정보들이 담겨 있는 파일

static 폴더, templates 폴더 만들기

폴더가 비어 있으면 서버에 업로드가 안 됨

비어 있는 폴더는 업로드가 안 됨

templates 폴더에 README.md 파일 만들기

templates/README.md

# 웹 애플리케이션 템플릿 파일을 두는 폴더

README.md 파일 복사해서 static 폴더에 붙여넣기

static/README.md

# 웹 관련 파일(HTML, CSS, JavaScript)을 두는 폴더

리소스 밑에 이런 것들이 있어야 됨

StudyApplicationTests.java

src/test/java - com.eomcs.study - AppTest.java 이름 바꾸기

Refactor - Rename
StudyApplicationTests로 바꾸기

복사

붙여넣기

폴더가 비어 있으면 서버에 푸쉬가 안 됨
README.md 복사해서 src/test/resources 에 붙여넣기

src/test/resources/README.md

# 단위 테스트 관련 설정파일을 두는 폴더

마지막으로
src/main/java - com.eomcs.study - App.java
Refactor - Rename
StudyApplication로 바꾸기

라이브러리 가져와야 됨

② 스프링부트 관련 파일 추가

src/main/resources/application.properties
                   static
                   templates

③ 프로젝트 설정 파일 갱신
$ gradle eclipse

C:\Users\bitcamp\git\bitcamp-study\java-lang\app>gradle eclipse

서버에서 라이브러리 받아오는 중

자바에서 제공하는 게 아님
스프링부트에서 제공하는 거

gradle의 장점이 이거

일일이 내가 어떤 라이브러리를 쓰겠다고 지정하지 않아도 알아서 싹 받아옴

④ eclipse IDE에서 프로젝트 정보 Refresh

라이브러리 다운로드 끝났으면 오른쪽 클릭해서 Refresh

Referenced Library 확인해보기

StudyApplicationTests.java 파일에서 import org.junit.jupiter.api.Test;로 수정해주기

회사에서는 zip 파일을 다운 받은 다음에

▣ 기존 자바 프로젝트를 스프링부트 프로젝트로 전환할 수 있는가?

src/test/java - com.eomcs.study 밑에 있는 AppTest.java 지우기

Sample 예제 지우니까 에러 안 뜸

북마크에 추가하기

https://spring.io/

https://docs.spring.io/spring-boot/docs/current/reference/html/

https://docs.spring.io/spring-boot/docs/current/api/

스프링부트 프로젝트를 만들어주는 사이트

스프링부트 플러그인

GENERATE 하면 다운로드 됨

다운로드 하기 전에 내부 구조를 보는 거

id 'eclipse' 추가
이클립스 설정파일 만들어줌

사용자가 명령창을 통해서 실행 되는 거

https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started

https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.first-application

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

http://localhost:8080/hello

C:\Users\bitcamp\git>cd eomcs-java

C:\Users\bitcamp\git\eomcs-java>cd eomcs-java-lang

.settings 삭제
.project 삭제

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang>cd app

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app>gradle cleanEclipse

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app>gradle eclipse

C:\Users\bitcamp\git>cd eomcs-java

C:\Users\bitcamp\git\eomcs-java>cd eomcs-java-lang

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang>cd app

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app>gradle eclipse

답을 정리해서 말하기

gradle init
현재 폴더를 메이븐 표준 프로젝트 구조로 만들어주는 거
현재 프로젝트를 메이븐 표준 프로젝트 구조로 구성해준다

gradle eclipse
이클립스
프로젝트 폴더로 인식할 수 있도록 이클립스

.project
.classpath
.settings

gradle cleanEclipse : 지우는 거

C:\Users\bitcamp\git>git clone https://github.com/eomcs/eomcs-java.git

class 블록과 클래스 파일

소스파일 이름이 뭔지에 상관없이 클래스 블록당 클래스 파일이 생긴다.

소스파일 한 개에 클래스 블록이 3개 있으면

한 소스 파일에 여러 개의 클래스 블록이 있을 경우 각 블록당 한 개의 클래스 파일(.class)이 생성된다.

다음과 같이 클래스명과 소스파일명이 다르더라도 괜찮다.
class Exam2_1x {}

public 클래스는 반드시 소스파일명과 일치해야 한다.
public으로 공개된 클래스는 반드시 소스파일명과 같아야 한다.
다르면 컴파일 오류가 발생한다.

The public type Exam2_2x must be defined in its own file

특별한 경우 아니면 한 파일에 한 클래스
소스 코드의 관리를 쉽게 하기 위해 보통 한 파일에 한 클래스를 둔다.

클래스 이름과 파일명을 같게 하여 찾기 쉽게 한다.

C:\Users\JYH\git\eomcs-java\eomcs-java-lang\app>javac -d bin/main src/main/java/com/eomcs/lang/ex01/Exam0300.java

에러남. 맥은 안 남. 맥은 기본적으로 소스파일이 utf-8이라고 인식을 함

소스파일 Properties 보면 UTF-8인데 컴파일할 때 UTF-8이 아니라 MS949라고 가정을 한다. 안 맞으니까 에러 뜨는 거.

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app>javac -encoding UTF-8 -d bin/main src/main/java/com/eomcs/lang/ex01/Exam0300.java

컴파일할 때 -encoding UTF-8이 옵션 붙이니까 에러 안 남

이클립스는 저장하면 자기가 알아서 컴파일할 때 -encoding UTF-8이 옵션을 붙여서 인코딩 함

컴파일할 때 소스 파일의 인코딩 문자집합을 지정하기
컴파일할 때 소스 파일의 인코딩 문자집합을 지정하지 않으면, 운영체제의 기본 문자 집합으로 저장되어 있다고 간주하고 컴파일한다.
컴파일 옵션
javac -encoding [문자집합] [소스파일명]

JVM이 클래스를 실행하는 과정

main 메서드가 없으면 에러남

일반 주석
//

여러 줄 주석 (traditional comment)
/* */
중간에 주석 삽입하고 싶을 때도 사용

Javadoc 주석
javadoc에서 HTML문서를 만들 때 사용하는 주석이다.
클래스나 메서드, 변수 선언에 붙일 수 있다.

/**
*
*
*/

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app>javadoc -encoding UTF-8 -charset UTF-8 -d ok -sourcepath src/main/java com.eomcs.lang.ex02

소스코드는 UTF-8로 되어 있다
HTML 만들 때 HTML 파일도 UTF-8로 저장해야 된다
HTML은 ok 라는 폴더를 만들고 거기에 둬
소스폴더 알려줄게
현재 app 폴더 아래에 src/main/java 여기야
java 폴더 밑에 com.eomcs.lang.ex02 패키지에 있는 모든 클래스를 다 뒤져서 각각의 클래스에 대해서 개발자 문서를 만들어

C:\Users\bitcamp\git\eomcs-java\eomcs-java-lang\app\ok

개발자들이 보는 문서를 만들 때 뭐하는 클래스인지 왜 만든 변수인지 설명을 달아놔야지 다음 후임자나 동료가 내가 짠 코드를 이해하기 쉽다

옛날에는 개발자가 문서를 만들 때 개발자가 붙이는 설명을

개발자 코드 사용법을 담은 문서 만들기

① 기존 방식

소스파일이 있으면 따로 워드파일을
개발자가 소스파일도 작성하고 워드파일도 따로 작성했었음
문제는 소스코드를 변경하면 문서도 변경해야 되는데 귀찮아서 안 하는 경우가 많다.

② 새 방식
개발자가 소스코드를 작성
소스파일에 아예 코드 설명을 같이 작성
소스파일 + 문서로 추출할 설명
이걸 가지고 HTML문서를 개발자 문서를 자동 생성
javadoc.exe 프로그램을 사용해서 자동 생성

아예 소스파일을 작성할 때 문서로 추출할 설명을 함께 작성함
이것도 귀찮아서 안 할 수 있음.

/**
  설명
*/

html을 만들 때 쓰는 doc 주석이다.

주석 - 애노테이션(annotation)
컴파일러나 JVM에서 사용할 주석이다.
컴파일 한 후에도 클래스 파일(.class)에 주석을 유지할 수 있다.

git 아이디 등록해놓은 거 삭제하기

자격 증명 관리

주석 3개
일반 주석
javadoc 주석
annotation 주석

리터럴(literal)

값을 표현한 것

문자열과 문자
문자열 : 0개 이상의 문자로 구성

package com.eomcs.study.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/literal/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1() {
    return "홍길동";
  }
}

http://localhost:8080/literal/exam1/test1

http://localhost:8080/lang/literal/exam1/test1

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1() {
    // 문자열을 표현하는 방법
    return "홍길동";
  }

  @GetMapping("/test2")
  public char test2() {
    // 문자를 표현하는 방법
    return '홍';
  }
}

숫자 : 100(정수), 3.14(부동소수점)

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1() {
    // 문자열을 표현하는 방법
    return "홍길동";
  }

  @GetMapping("/test2")
  public char test2() {
    // 문자를 표현하는 방법
    return '홍';
  }

  @GetMapping("/test3")
  public int test3() {
    // 정수를 표현하는 방법
    return 100;
  }
}

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1() {
    // 문자열을 표현하는 방법
    return "홍길동";
  }

  @GetMapping("/test2")
  public char test2() {
    // 문자를 표현하는 방법
    return '홍';
  }

  @GetMapping("/test3")
  public int test3() {
    // 정수를 표현하는 방법
    return 100;
  }

  @GetMapping("/test4")
  public float test4() {
    // 부동소수점을 표현하는 방법
    return 3.14f;
  }
}

f는 4바이트 부동소수점을 가리킨다.

논리 : true, false

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam1")
public class Exam1 {

  @GetMapping("/test1")
  public String test1() {
    // 문자열을 표현하는 방법
    return "홍길동";
  }

  @GetMapping("/test2")
  public char test2() {
    // 문자를 표현하는 방법
    return '홍';
  }

  @GetMapping("/test3")
  public int test3() {
    // 정수를 표현하는 방법
    return 100;
  }

  @GetMapping("/test4")
  public float test4() {
    // 부동소수점을 표현하는 방법
    return 3.14f;
  }

  @GetMapping("/test5")
  public boolean test5() {
    // 논리 값을 표현하는 방법
    return true;
  }
}

레퍼런스(주소) : null

  @GetMapping("/test6")
  public Object test6() {
    // 주소가 지정되지 않았음을 표현하는 방법
    return null;
  }

아무것도 안 나옴

리터럴 4개의 종류 기억하기

// 리터럴 : 숫자를 표현하는 다양한 방법

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam2")
public class Exam2 {

  @GetMapping("/test1")
  public int test1() {return 100;} // 10진수

  @GetMapping("/test2")
  public int test2() {return 0144;} // 8진수

  @GetMapping("/test3")
  public int test3() {return 0b01100100;} // 2진수

  @GetMapping("/test4")
  public int test4() {return 0x64;} // 16진수
}

출력할 때는 무조건 10진수로 출력함

정수 리터럴과 진수법

2진수를 간단하게 표기한 방법

0110 0100
4비트씩 끊는다

   0110 0100
0x   6    4

16진수 = 2진수를 짧게 표기할 때 유용하다

8진수는 별로 안 씀

0b0110_0100 언더스코어 붙여도 됨

0b0110_0100 = 0b110_0100

근데 보통 4자리씩 끊어서 씀

// 리터럴 : 숫자를 표현하는 다양한 방법

package com.eomcs.study.lang.literal;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/lang/literal/exam2")
public class Exam2 {

  @GetMapping("/test1")
  public int test1() {return 100;} // 10진수(숫자를 사용할 때 기본으로 많이 사용)

  @GetMapping("/test2")
  public int test2() {return 0144;} // 8진수

  @GetMapping("/test3")
  public int test3() {return 0b0110_0100;} // 2진수

  @GetMapping("/test4")
  public int test4() {return 0x64;} // 16진수(문자의 코드 값을 표현할 때 많이 사용)
}

2진수를 16진수로 바꾸거니
16진수를 2진수로 바꾸기 편하다

10 = a
11 = b
12 = c
13 = d
14 = e
15 = f


④ 이해가 안 되는 예제는 강사에 질문

좋은 웹페이지 즐겨찾기