Enum type 에 대해서

Enum 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class 선언과 유사 하고 
변수, 생성자, 메서드를 추가 할수 있다.

생성자는 자동으로 private 잡히고 인스턴스가 전체 프로그램에
하나만 생성 되는 것을 자바에서 보장 해 싱글톤으로 활용 된다고 한다.

public enum CarMaker {

KIA(100), HYUNDAI(200), BMW(300);

private final int value;

CarMaker(int value)
{
this.value = value;
System.out.println("Contractor:"+value);
}

....
}

Enum 사용

정의 한 Enum의 사용은 CarMaker.KIA 이다.
마치 static class 의 변수 참조 하듯이 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
values(), ordinal, name(), valueOf() 등을 호출 할수 있다.

public class EnumEx {

public static void main(String[] args) {

CarMaker maker = CarMaker.KIA;

CarMaker[] list = CarMaker.values();

for (CarMaker c : list) {
System.out.printf("ordinal:%d name:%s \n", c.ordinal(), c.name());
}

CarMaker value = CarMaker.valueOf("KIA");
System.out.println(value);

}
}

실행 결과

1
2
3
4
5
6
7
Contractor:100
Contractor:200
Contractor:300
ordinal:0 name:KIA
ordinal:1 name:HYUNDAI
ordinal:2 name:BMW
KIA

프로세스에 코드가 올라가면서 Static으로 상수 숫자 만큼 생성자가 호출 된다.
여기선 KIA, HYUNDAI, BMW 3개임으로 3번.

maker 를 디버거로 인스턴트화 된것을 보면
maker 는 value, name, ordinal 을 멤버로 가지고 있음

  1. value = 100
  2. name = “KIA”
  3. ordinal = 0

values()는 이를 가지고 있는 배열을 반환 한다.

싱글톤 활용에 대한 글

https://scshim.tistory.com/361

출처

https://www.youtube.com/watch?v=jVlzwq41whE&t=1s

main 함수 있을때 Jar 파일 (console에서)

방식1, manifest 써서

mainfest.mf 생성
Manifest-version: 1.0
Main-Class: Main

마지막 라인 후에 newline 있어야 한다

1
2
3
javac Main.java
jar cfm test.jar manifest.mf Main.class
java -jar test.jar

방식2, manifest 안쓰고

1
2
3
javac Main.java User.java 
jar cfe user.jar Main Main.class User.class
java -jar user.jar

Jar 파일 확인 법

1
jar tf test.jar

package 키워드 넣어 실행하기 (console에서)

package 키워드

1
package 패키지명;

아래 예제를 보면
com.company.console 이 패키지 명이고 folder path 가 된다.

1
2
3
4
5
6
7
package com.company.console;

public class Main{
public static class main(String[] args) {
System.out.println("Hello World");
}
}

어떤 일을 하는가?

클래스 이름을 full name으로 변환 해 준다.
Main class 을 com.company.console.Main 로 변환 한다.
(javap 역 어셈블러 하면 변환 직접 확인 할수 있다.

package 선언 안하면

자바에서 기본적으로 제공 하는 곳에 한다.
‘이름 없는 패키지’ (unnamed package)라고 부른다.

컴파일

javac 파일 이름

‘-d .’ path에 폴더들을 만든다.

소스 파일 안에 import 있으면 경로 찾아 들어가 그 파일도 컴파일 하는 듯 하다.

콘솔에서 실행

이 부분에서 제일 헤맸는데..

full name을 넣어줘야 하고 실행 위치도 중요 하다.

파일 경로: c:\project\com\company\console\Main.java
컴파일을 > c:\project>java com.company.console.Main

블로그 Hexo 적용~

Jekyll를 떠나기로 하고 다른 툴을 써보기로 생각하고 조사를 했고 요즘 많이 쓴다고 하는 Hexo를 찾았다.

아래 개발 블로그유튜브 영상을 참고 했다.

사용 해 보니 맘이 듣다. 포스트 글을 tag 와 시간대를 분류 하는 걸 원했는데 셋팅 하는 법도 쉽게 찾았다.

적었던 글들을 옮기고 올리는걸 보니 깃헛페이지에 workflow가 여전히 빌드 해서 배포를 한다. Jekyll 이 쓰이는 듯 하고.

셋팅 하면서도 유사한 점들이 보였는데 Hexo는 Jekyll 기반 위에서 돌아가는 듯 하다.

Hexo 자주 쓰는 명령어 노트

자주 쓰는 명령어를 여기 남기려고 한다~

Hexo

Hexo 사이트!
다큐먼트
트러블슈팅
이슈 있을땐 GitHub로

Create a new post - 새글 쓸때

1
hexo new "My New Post"

More info: Writing

Run server - 로컬에서 테스트 할때

1
hexo server

More info: Server

Generate static files - 다 쓰면서 이걸 돌린다

1
hexo generate

More info: Generating

Deploy to remote sites - GitHub 로 올린다

1
hexo deploy

More info: Deployment

Jar 파일 include 해서 컴파일 하는 법 (console에서)

결론: 윈도우 개발 환경에서 -cp 가 제대로 안되는가 싶다. 나중에 리눅스 환경 생기면 해보자..

User.java

1
2
3
4
public class User {
private String name;
int idx;
}

Main.java

1
2
3
4
5
6
7
8
public class Main {

public static void main(String[] args) {

User user = new User();
System.out.println(user);
}
}

~/User/User.java
~/Main/Main.java

User 컴파일 및 Jar 파일 생성

javac User.java
jar cf User.jar User.class

User.jar 파일이 만들어졌다 Main 폴더로 복사

Main 컴파일

javac Main.java

User symbol을 못 찾겠다는 컴파일 에러 발생

javac -cp User.jar Main.java
cp로 classpath를 넣어주니 컴파일 성공 한다.

실행

java Main

에러가 나온다
Exception in thread “main” java.lang.NoClassDefFoundError: User
at Main.main (Main.java:5)

User class 못 찾는 다는 내용으로 보여서 컴파일 때 처럼
classpath 을 넣어 주면 될것으로 생각 해서

java -cp User.jar Main
Error: Could not find or load main class Main

여기서 막혔다..

Stackoverflow 에…

(올린 질문 글)[https://stackoverflow.com/questions/71861212/import-jar-file-into-my-hello-world-console-application]

(Jar 파일 include 방법)[https://stackoverflow.com/questions/9395207/how-to-include-jar-files-with-java-file-and-compile-in-command-prompt#comment11870389_9395207]

나의 윈도우 개발 환경에서 -cp 에 멀 넣어도 안된다.

대세 프레임워크, Spring 와 Spring boot ?

Spring은 자바의 긴 역사 만큼이나 방대한 개발 Framework 이고
Boot은 쉽게 Spring 기반 어플리케이션을 만들 수 있게 구성해 놓은 Spring의 프로젝트 중 하나 이다.

Spring은 오픈소스 프로젝트이다.

Spring Boot makes it
easy // 쉽고
to create stand-alone // 단독 구성 되고
production-grade // 바로 상용 서비스 갈수 있는 높은 수준이며
Spring based Applications // Spring 기반을 사용 하며
that you can “just run” // 간단히 구성, 실행 되게 해준다

마이크로 서비스들로 구성하는 것이 트렌드로 자리잡았고
타 진영의 좋은 개발 프레임워크들이 많이 나오는 상황에서
자바 진영의 대응책이라고 본다.

자바로 마이크로 서비스를 한다면 대세가 스프링, 스프링 부트라고 보면 될듯 하다.

Boot의 특징, 다시 정리 하면~

  1. 간편한 설정
    설정 파일: applications.properties 혹은 application.yml 에서

  2. 편리한 의존성 & 자동 권장 버전 관리
    Framework, 라이브러리, 모듈을 사용 하기 위한 설정을 보면
    Spring 시절에는 20여줄 Boot는 1줄

  3. 내장 서버로 인한 간단한 배포 서버 구축
    embedded server 웹서버가 내장 되어 있고 내장 서블렛 컨테이너로 간단히 배포

  4. Security, Data JPA 등의 다른 Spring 요소를 쉽게 사용

프로젝트 구성 시작 점 (http://start.spring.io)

공식 웹사이트에 프로젝트를 구성해 주는 기능이 있다.

들어가서 Dependencies 부분을 보면 여러 구성 Framework들이 무엇이 있는지 설명과 함께 보여준다.

필요한 것을 선택 해서 나의 프로젝트 시작점을 구성 할수 있고 자바 스프링 입문 강좌를 들을때 통상 이중 2개를 선택, 시작 프로젝트를 만든다.

  1. Spring Web - 웹 개발에 쓰이는 모듈등의 모음이고 보면 RESTFul, Spring MVC, Tomcat 등등 넣어준다
  2. Thymeleaf - HTML 등을 출력 해주는 모듈이다

그외 Security 에서 인증, SQL 쪽에 여러 Data mapping 모듈들이 있어 중급 강좌가면 이들 라이브러리의 사용법을 익히게 될듯 하다.

Boot 이전에는 이런 구성을 하는데 많은 시간과 노력이 필요 했다고 한다. Spring은 설정이 프로젝트의 절반 이란 말이 있단다.

추가 설명

영상이 많은데 자기 전에 틀어 놓고 들는 것도 입문 레벨에선 꽤 괜찬은 학습 방법 일듯 하다.
https://www.youtube.com/watch?v=YSsl5-q2BR4


잘모르는 컨셉을 찾다 보니 아래 들을 추가로 보게 되었다..

스프링, 스프링 부트 공부는 언제?

https://miromike.github.io/assets/images/master%20java%20roadmap%20from%20amigoscode.jpg

마이크로서비스 란?

Wiki에서의 정의, AWS

마이크로 서비스가 대세라면 이전에는 ?
모놀리식 방식 (Monolith)

이전 레거시 시스템을 마이크로 서비스 로의 설계 변경 및 적용 한 회사들, 사례 들이 쏟아져 나온다. 예로 배민의 유명 개발자이신 김영한님 - 우아콘2020, 배달의민족 마이크로서비스 여행기 정리

DevOp 와 배포, 컨테이너, Docker, 큐버네트 등 다 이어진다.

Web 프로그래밍 역사?

클라이언트 와 서버 (request 와 response)

정적 웹페이지 와 동적 웹페이지

동적 웹페이지 경우 웹서버와 C 나 PHP 등의 서버 프로그램과 통신

통신 규약으로 Common Gateway Interface (CGI)

동작되는 애플리케이션을 자바에선 Servlet이라고 부름

이후 전체적으로 돌아가는 부분을 디자인 패턴 개념을 넣고 Framework가 만들어졌는데 이것이 Spring이고 대세가 되었다..

사실 다른 상용 프레임워크도 많고 쓰이겠지만 오픈소스로는 Spring 이다.

사용자 증가 등으로 퍼포먼스 개선 필요

Web Server가 Process 띠어서 CGI 구현체 실행 하며 Process 임으로 퍼포먼스가 나빴음.

개선점 1. Process 에서 Thread로
개선점 2. 여러 Instance 들을 Singleton로

마지막으로

우아한테크 특강으로 백기선님의 스프링부트 발표 LIVE 하는게 있는데 댓글(개발자 의심의 흐름)도 볼수 있어 매우 재밌다. 영상이 2시간으로 길지만 시간이 있다면 추천한다.

참고한 출처

스터디 덕으로 공부 잘 했다.. :)

1, 2, 3, 4, 5

웹서버와 WAS
다른분 설명
Framework 설명

빌드 툴, 메이븐(Maven)와 그레이들(Gradle)

빌드 관리 도구란

프로젝트에 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드 해주는 도구
소스 코드를 컴파일, 테스트, 정적분석 등을 하여 실행 가능한 앱으로 빌드 해줌
프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업을 진행해줌
외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트의 관리해줌

자바의 대표적인 빌드 도구: Ant, Maven, Gradle

메이븐 (Maven) 이란?

자바의 대표적인 관리 도구였던 Ant를 대체 하기 위해 개발됨
프로젝트의 외부 라이브러리를 쉽게 참조 할수 있게 pom.xml 파일로 명시하여 관리 (폼파일)
참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨

메이븐 (Maven)을 사용하는 이유

기존의 사용하던 Ant는 빌드의 기능만 가지고 있음
자동으로 라이브러리를 관리해주는 기능이 추가된 Maven을 사용
다운받아 사용하던 라이브러리에 변동 사항이 있으면 자동으로 업데이트 하여 적용됨

Ant

  • XML 기반의 빌드 스크립트
  • 자유로운 빌드 단위 지정
  • 간단하고 사용하기 쉬움
  • 대규모 프로젝트에서 복잡해지는 경향이 있음
  • 라이프 사이클이 없음

Maven

  • XML 기반의 빌드 스크립트
  • 라이프 사이클 도입
  • pom.xml로 편하게 Dependency 관리

메이븐(Maven) 간단 사용법

pom.xml 파일을 활용하여 빌드 및 관리
pom.xml 의 역할
modelVersion, groupId, artificatId, version, name, description, properties, dependendies, build
groupId : 통상 개발 사이트 도메인
properties : 빈번하게 사용하는 중복 상수를 정의
dependendies: 가장 중요, 해당 프로젝트의 의존성, 즉 어떤 라이브러리가 필요 한지 리스팅

메이븐(Maven) 실습, 예제

eclipse -> Lombok
https://mvnrepository.com/

그래들 (Gradle) 이란?

Groovy 스크립트를 활용한 빌드 관리 도구
안드로이드 프로젝트의 표준 빌드 시스템으로 채택
멀티 프로젝트(Multi-Project)의 빌드에 최적화 하여 설계됨
Maven에 비해 더 빠른 처리 숙도
Maven에 비해 더 간결한 구성

그래들 (Gradle)과 메이븐(Maven) 비교

Maven이 점유율이 더 높고 점차 Gradle이 올라가는 중
Gradle 성능이 더 좋고 특히 대규모 프로젝트
Maven: pom.xml Gradle: build.gradle

그래들 대표 용어

repositories: 라이브러리가 저장된 위치등 설정
mavenCentral: 기본 Maven Repository
dependencies: 라이브러리 사용을 위한 의존성 설정

대표 Repository Site

Maven Repository: https://mvnrepository.com


출처1: 출처2: 레퍼런스:

gradle run 위한 고난의 길

Youtube 검색 등 찾았을때 linux나 Mac 에서의 gradle 설치 예제 들이 주로 나왔다.

현재 Windows를 쓰고 있어 고민 끝에 가상 PC 프로그램/VM을 설치 하고 그위에 linux을 깔아보기로 한다.

아래 유튜브를 보고 설치 했다.
https://www.youtube.com/watch?v=PqgWp7rbqws

가상 PC프로그램/VM은 Virtual box 를 찾아 다운로드 받았고
linux은 ubuntu 사이트에 들어가 다운로드 받았다.

여기가 실습 해 볼수 있는 가이드 내용이다.
https://docs.gradle.org/current/samples/sample_building_java_applications.html

윈도우 설치 법이 있는 것을 나중에 찾았다.
https://gradle.org/install/

Scan class, 줄입력이 안될때..

scan class 을 사용 해서 숫자, 문자열을 여러번 입력 받는 코드 짤때 주의 할 부분이 있다.

nextInteger() 호출 하고 nextLine() 호출 해줘야 된다.

nextInteger는 입력 버퍼에서 carriage return 바로 전까지만 입력 받아서 그렇단다.

버퍼에 carriage return 이 남아서 다음 입력 함수에 이게 영향을 준다. (바로 스킵 된다.)