프로젝트가 실행될 때 가장 먼저 실행되는것이 _app.tsx 이다. 만약 localhost:3000/home 으로 접속 시 _app.tsx 가 실행되면서 Comonent로 "home" Component가 들어오게된다 그렇기에 레이아웃을 씌우는 대상은 _app.tsx가된다
즉, Bean 등록용 class로 사용할 수 있고 일반 메소드 또한 만들수있지만 주로 Bean 을 보조하는 역할을 한다
@Bean
외부 라이브러리 등 반환되는 객체를 Bean 으로 등록한다
쉽게말하면 @Bean 어노테이션을 사용하면 new ~ 로 생성해서 import 하지않아도 된다
스프링 간 객체가 의존관계를 관리하도록 하는 것에 가장 큰 목적이다
new 로 생성하면 생성자를 그득그득 붙여서 변경가능성이 있는데, Bean 을 사용하면 변경이 안되겠지
@Configuration //여기는 @Bean 등록 전용 class!
public class TestConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
@Bean(name="myMethod")
public MyBean myBean() {
return new MyBean();
}
// @Bean 어노테이션이 없는 메소드
public SomeConfiguration someConfiguration() {
// 구성 정보 반환
return new SomeConfiguration();
}
}
Client 에서 서버로 요청 시 복수의 parameter 를 전달할 때 사용 json 기반의 Http Body 를 컨트롤러에서 자바객체로 변환 (Client 에서 보낸 json body를 객체형태로 매핑)
Client 에서 보내고싶은 데이터가 여러개 있을 경우 주로 사용된다.
아래와 같이 param 안에 데이터를 넣고
var param = {
title : "1111",
content : "hello",
userName : "admin"
}
해당 어노테이션을 넣으면 컨트롤러에서 해당 데이터를 객체로 자동 매핑한다
이때 유의할 점은 PostDto 에서 선언된 변수명과 param 에 들어있는 변수명이 완벽하게 같아야 한다
public class PostDto {
private String title;
private String content;
private String userName;
}
/////
@PostMapping(value = "/index-request")
public String indexRequest(@RequestBody PostDto postDto) {
return "/user/index";
}
만약 변수명이 같지 않은 경우 별도로 에러는 발생하지 않으며, 해당 변수만 해당 객체에 매핑되지 않는다
@ResponseBody
Client 로 data 반환 시 사용하며 객체 data 를 json 으로 바꿔 반환한다
해당 어노테이션의 위치는 return type 객체 앞에 써도 되지만, 나는 개인적으로 방법 2를 선호한다
// 방법 1
@GetMapping(value = "/index-rest")
public @ResponseBody ResponseEntity indexRest() {
//json type으로 반환하기 위하여 @ResponseBody 어노테이션이 필요함
return ApiResponseEntity
.builder()
.ok();
}
// 방법 2
@ResponseBody
@GetMapping(value = "/index-rest2")
public ResponseEntity indexRest2() {
//@ResponseBody 어노테이션은 return type 앞에 위치한것보다 현재의 형태가 제일 깔끔해 보인다
return ApiResponseEntity
.builder()
.ok();
}
위와 같은 코드로 컨트롤러에서 데이터를 보내면 Client 에서는 아래와 같은 형태로 받게된다
jenkins에게 sudo 명령 실행권한을 부여하고 실행할때 password 를 물어보지않는 설정을 추가하고 해당파일 보안설정을 해준다
$ jenkins ALL=(ALL) NOPASSWD: ALL
$ chmod 0440 jenkins
근데 나는 이 방법으로는 jenkins 배포할때 권한이 자꾸 튕겨져나가서, 아래 커맨드도 실행했다
$ echo "jenkins ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d jenkins
$ sudo chmod 0440 /etc/sudoers.d/jenkins
2. Jenkins - Github 계정 연결
이제 Jenkisn 웹페이지에 접속해보자
Jenkins 에서 github 를 사용하려면 우선 github계정을 jenkins에 등록시켜야 한다
이때 사용할 github계정은 엄밀히 말하면 내가 배포하려고 하는 repository에 접근 가능한 github 계정이기만 하면 된다
대시보드 > Jenkins 관리 > System 으로 이동해보자
Github 이라는 영역이 보일텐데 여기서 git hub 계정추가가 가능하다
gitHub server 콤보박스를 선택하면 아래와 같은 영역이 노출될것이다
고대~~~로 냅두고 Credentials 하단의 Add 를 눌러준다
Credentials 는 Jenkins 에 등록된 github 계정목록이 노출되는 부분이지만
지금은 등록된 github 계정이 없으므로 none으로 보이는것일뿐이다
각 항목의 의미는 아래와 같다
username : gihub 계정 username password : github 계정 password ID : 해당 정보를 대표할 name이며, 해당 계정을 구분하기위한 용도로만 사용되는 대표이름. title Description : 안적어도 됨
username은 github의 username 이고 ID는 jenkins 에서 사용할 id이다 즉, Credentials 목록에 노출될 text이다
이렇게 입력하면 비로소 Credentials 에 내 계정이 보인다
3. Jenkins - SSH 설정
앞으로 Jenkins 에서 AWS 서버에 접속하여 배포를 진행하겠지만, 우리는 해당서버에 pem/ppk 파일로 접속하고있기때문에 Jenkins에도 해당정보를 전달해주어야한다
1) SSH 플러그인 설치
기본적으로 Jenkins 에는 SSH 플러그인이 없기때문에 따로 설치해줘야 한다
아래 경로로 이동한다
Jenkins 관리 > 플러그인관리 > 설치가능 > Publish Over SSH 설치
설치완료되고 재시작 여부를 물으면 재시작해준다
재시작이 완료되면 System 관리 > Publish Over SSH 영역이 생겨있는것을 볼 수 있다
key 영역을 입력해줘야하는데, 다운받아놓은 pem 파일을 크롬에 던지면 텍스트가 주루룩 나온다
그것을 입력해주자
하지만 이것은 pem 파일만 등록된거고, 그래서 어느 서버에 적용할건지 설정해줘야한다.
하단의 추가 버튼을 클릭하여 SSH Server 를 등록하자
name : 해당 서버를 지칭할 이름. 중요하지않다 title 개념 hostname : AWS IP주소 username : 유저명 (우리의 경우는 ubuntu라고 적는다) remote directory : 젠킨스로 생성된 배포파일의 root 경로
여기서 어려운 부분은 remote directory 인데, 우선 AWS 서버 내 배포파일이 저장될 위치를 알아서 정해보자.
나는 home 디렉토리에 ubuntu 폴더를 만들었다.
그래서 위와같이 Remote Directory 는 /home/ubuntu 가 되었다
이렇게 하면 Jenkins가 실제로 배포할때 서버에 접속할 수 있게 되었다
3. 배포 item 생성 - Free Style
자 드디어 배포를 해보자!!
Dashboard 에서 새로운 Item 을 추가해준다
다양한 선택지가 있지만, 우선 Freestyle project 를 만들어보겠다
해당 프로젝트명 혹은 구분가능한 이름을 input에 입력해주자
두가지 옵션의 간단한 차이는 아래와 같다
Freestyle project ? -> jenkins 설정으로만 배포한다
Pipeline ? -> 프로젝트 소스코드에 내가 직접 커맨드를 입력한 정보를 기반으로 배포한다
item 을 생성하면 또!! 설정창이 나온다 ㅎㅎ
기존에 설정했던것이 서버에 대한 설정이라면, 지금은 repository 에 대한 설정이라고 보면된다
1) Github 설정
설명 부분에 해당 프로젝트의 설명을 간단히 입력해주고 하단의 Github project 체크박스를 선택한다
그리고 나의 repository 주소를 넣어준다. git clone 할때 입력되는 http 주소이다
밑에 내리면 소스코드관리 -> Git 을 선택한다
Repository URL 은 위에서 입력한 github 주소와 똑같이 입력해주고, Credentials도 기존에 설정된 계정을 선택한다
하지만!!!
만약 private github repository 를 사용한다면 해당 계정으로는 오류가 발생한다
원인은, 정책변경으로 인하여 user/password 방식으로 등록한 github계정으로는 해당 repository에 접근이 불가하다
토큰방식으로 등록된 github 계정이 필요하다
또한!! 해당 private repository를 생성한 계정이 필요하다.
repository 가 public 이라면 아래 과정은 넘어가주길 바란다.
만약 private 라면 Credentials 하단의 Add를 눌러서 토큰방식의 계정을 추가해보자
secret 에 github에서 발급받은 토큰을 입력해야한다
Kind → Secret Text 선택 (토큰 인증방식) Domain : Global credentials Secret : 깃헙에서 발급 받은 토큰 입력 ID : 해당 정보를 대표할 name이며, 해당 계정을 구분하기위한 용도로만 사용되는 대표이름. title Description : 안적어도 됨
2) Build Step 설정
github 설정하고 내리다보면 빌드유발..빌드환경..등등 많이 있지만
안타깝게도 AWS 프리티어는 빌드를 할때마다 data transfer fee가 청구된다 ㅠㅠ 그래서 한달에 정해진 용량이있는데..
내가봣을땐 한달에 30번정도 하면 용량에 딱 맞았던거같다. 그래서 github hook을 연결해서 빌드하는 작업은 건너뛰었다
이제 각 프로젝트에 맞는 빌드과정을 진행하면 되는데, 나는 Spring boot - java 프로젝트를 배포하였다