0531 - 0606


# 0531 - 0606

# 0531 - hal+json

# Hypertext Application Language (HAL)

HAL은 JSON 또는 XML 코드 내의 외부 리소스에 대한 링크와 같은 하이퍼 미디어를 정의하기위한 인터넷 초안 표준 규칙.

  • MIME 유형 media type : application/hal+json

# HAL 예

{
"_links": {
  "self": {
    "href": "http://example.com/api/book/hal-cookbook"
  }
},
"id": "hal-cookbook",
"name": "HAL Cookbook"
}

# 0601 - jmap으로 JVM heap 상태 확인

JDK에 포함된 jmap 명령으로 실행 중인 JVM의 heap 상태를 확인해보자.

  • JVM의 프로세스 ID 확인
$ jps
또는
$ ps -ef | grep java
  • JVM의 heap 상태를 확인할 때는 -heap 옵션을 사용한다.
$ jmap -heap PID
  • -histo 옵션으로 클래스별 객체 수와 메모리 사용량 확인
$ jmap -histo:live PID | more
  • -dump 옵션으로 heap dump 후, MAT 등으로 분석
$ jmap -dump:format=b,file=heap.PID.hprof PID

# 0602 - jenkins를 이용해서 배포하기

# 젠킨스의 큰 기능 두가지

  • Build & Deploy
  • Batch

# 젠킨스 설치

# jenkins
sudo yum install wget
sudo yum install maven
sudo yum install git
sudo yum install docker

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins
  • 초기 비밀번호 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# 배포시 젠킨스 인스턴스만 접속할 수 있게 하기

  • Publish over SSH 플러그인 설치(젠킨스 인스턴스)

  • 공개키 & 개인키(젠킨스 인스턴스)

// 공개키 & 개인키 생성
ssh-keygen -t rsa -f ~/.ssh/id_rsa

// 키 복사
vi ~/.ssh/id_rsa.pub    // 해당내용 복사

*** gcp 환경에서는 authorized_keys 수정 불가능

  • 공개키 등록(워커 인스턴스)
// authorized_keys 파일 끝에 공개키 복사
vi ~/.ssh/authorized_keys 
  • 폴더들 권한 변경(워커 인스턴스)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
  • Publish over SSH 설정 추가
    • 개인키 및 워커 서버정보 추가

# 배포스크립트 관리 및 빌드

  • item 추가
    • item 설정 및 빌드 후 조치 설정
    • 관리 및 빌드 명령어
    nohup docker run -p 8080:80 sung431/spring-boot-cpu-bound > /dev/null 2>&1 &
    
  • docker.sock 권한 변경
sudo chmod 666 /var/run/docker.sock
  • build
  • console 확인

# 정리

  1. 소스코드는 GitHub가 가지고 있다.
  2. 애플리케이션 실행은 인스턴스에서 되어야 한다.
  3. 인스턴스에서 바로 GitHub에 있는 소스코드를 가져와서 빌드 후 실행시킬 수도 있지만, 이러면 매번 인스턴스에 접속해야한다.
  4. 인스턴스가 여러개면 여러개의 인스턴스에 각각 다 접속해서 3번을 해야한다. 비효율적
  5. 중간에 Jenkins 라는 미들웨어를 두고, GitHub에서 소스코드를 가져와서 빌드하고 인스턴스에 배포/실행 할 수 있다.
  6. 5번을 위해 Jenkins에 GitHub 저장소 URL을 등록하고, 빌드 스크립트를 작성하고, 배포될 인스턴스에 SSH로 접속할 수 있도록 세팅한다.
  7. 6번까지 완료되었으면 이제 Jenkins에서 간단히 배포할 수 있다.
  • 명령어 정리
// 1. jenkins-instance 서버 명령어
$ sudo yum install wget
$ sudo yum install maven
$ sudo yum install git
$ sudo yum install docker
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ sudo yum install jenkins
$ sudo systemctl start jenkins
$ sudo systemctl status jenkins

// 2. cpu-instance 서버 명령어
$ vi authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ sudo chmod 666 /var/run/docker.sock

# 0605 - @Bean 과 @Component 차이

# @Bean 과 @Component 차이

  • @Component는 Class Level에서, @Bean은 Method Level에서 적용된다.
  • @Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은경우 사용, @Component는 직접 컨트롤이 가능한 Class들의 경우 사용

# @SpringBootApplication

  • @SpringBootApplication은 @Configuration, @ComponentScan을 상속
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
Last update: July 22, 2021 19:09
Contributors: jaesungahn91