728x90
반응형
SMALL

이번 WIL의 키워드

실전 프로젝트를 진행하면서  본인이 담당했던 기능 정리

- 기존 협업툴에 대한 시장조사 + 사전 설문조사
https://useful-cheshire-922.notion.site/a5eac64bacf44652a8a63b1f2f441ed2

 

시장조사

사전 설문조사

useful-cheshire-922.notion.site

- CI & CD 구성 + 깃허브 액션 
  -> docker 
  -> s3 

docker 로 진행을 하다 멘토링에서 docker 보다는 s3이 더 적합하다고 듣기도 했으며, 서버에서 도커를 사용하는 비용과 메모리 양을 생각했을 때, s3로 관리하는 것이 좋을 거 같아 최종 선택!

아키텍쳐 를 정리하고 구성도를 미리 작성했습니다.
도커는 로컬에서 작동하는 것을 성공했습니다.
깃허브 액션을 적용하는데 약 300번의.. 실패...끝에 해냈습니다.
디렉토리 안에 만들어져 있어 인식을 하지 못해 레파지토리를 새로 만들어적용 시켰습니다.


- 와이어프레임, 기능명세서, API 명세서

https://www.figma.com/file/BI4UMLfw8NBgY3e3u23H0I/%EB%94%B8%EA%B9%8D-%EA%B8%B0%ED%9A%8D-%EB%85%B8%ED%8A%B8?node-id=0-1&t=LuR2xwJ6PhuBmEhE-0 

 

Figma

Created with Figma

www.figma.com

https://useful-cheshire-922.notion.site/API-6da56c573b8e45c1828a7ff09de00155

 

API명세서

회의

useful-cheshire-922.notion.site

 

- HTTPS 연결 
  기존에 있던 도메인을 활용해서 시도 -> health check에서 실패가 되어 계속 실패했고, 시큐리티 필터에서 따로 제외를 하지 않아서 적용하는데 많은 시도 끝에 성공

- 티켓, 댓글, 리뷰, 리뷰 댓글 구현 
   티켓의 등록, 상세조회, 수정, 삭제
   댓글의 등록, 수정, 삭제
   리뷰의 등록, 전체조회, 상세조회 ,수정, 삭제
   리뷰 댓글 등록, 수정, 삭제
초기 구현은 이렇게 했으며, 티켓의 이동이 자유롭기 때문에 만들어서 보냈으나 팀원들과 생각이 조금 다른부분이 있어서 시간이 많이 걸렸습니다.

public enum TicketStatus {
   TODO,
   IN_PROGRESS,
   DONE;
}

만들어서 보냈으나 팀원들과 생각이 조금 다른부분이 있어서 시간이 많이 걸렸습니다.
완료한 티켓을 보이게 하느냐, 아니냐 + 티켓 부분의 유효성이 가장 어려웠습니다. 라벨을 가진 사람만 등록이 가능한지 전체가 가능한지 등 고려해야할 것이 많았기 때문에 수정의 수정의 수정을 했습니다.

- codedeploy에서도 하루 정도 시간을 낭비한 적이 있는데,
RDS에 EC2를 연결하지 않아서 발생한 문제!! 
새 인스턴스에 coedeploy설치하고, 재부팅 or 중지 후 시작을 하지 않아서 발생한 문제!!

- aws 계정 정지... (계정이2개여서 다행이였죠..)
결제일이 1일인데, 자동 결제가 되지 않아서 발생한 문제 + 이상한 접근이 있어서 폐쇄한다는 이메일을 받았습니다.
계정을 돌려받는데 5일 정도 걸렸습니다. (다른 계정으로 이동하면서 자잘하고 사소한 실수 등 이걸 다시 한번 씩 되집어 가는 시간이였습니다.)

- redis 서버 실행 
이메일 인증과 리뷰 알람 기능 때문에 레디스가 필요하기 때문에 서버를 구축하고 비용을 생각해서 월 750시간이 무료이기 때문에 다른분 서버에 띄우고 시간이 지날 경우 제가 다시 띄우기로 했습니다. (비용은 소중합니다..)

- 웹소캣 기본 구축
리뷰 알람 or 메세지 채팅 기능을 고민하고 있습니다.(시간적인 문제로 연결이 가능할지 몰라 일단 둘다 구현을 해놓았습니다.)
둘다 구현은 완료 했고, 테스트를 하면서 수정을 하고 있습니다.

- nginx 무중단 배포 
프록시 서버에서 스프링부트를 실행시키고, 80으로 리다이렉트하게 했습니다.
도메인을 여기서 발급가능한데, 여러번 연습을 하면서 알게 된 사실이 인증서를 발급 받으면 2일 ~ 3일 재발급이 힘듭니다...
다른 블로그에 설명은 적혀있는데, 저장하는 키 이름은 찾기가 힘들더라구여.. 그리고 제대로 적용이 되었는지 확인하는데 오래걸렸습니다.
현재는 nginx도메인 + 스프링부트 연결 성공 했습니다.
무중단 배포를 위해 sh 파일을 고민하고 있습니다. 고민이 끝난 후 로드 밸런서 블루/그린을 공부한 후 바로 적용을 할 예정입니다.

앞으로 해야할 일 
- nginx 무중단 배포 
- Auto Scaling
- 인스턴스 서버 업그레이드
- 방화벽
- 보안
- redis 알림 및 채팅 연결

728x90
반응형
LIST

'일상 > WIL' 카테고리의 다른 글

10주차 WIL  (0) 2023.04.03
9주차 WIL  (0) 2023.03.26
8주차 TIL  (0) 2023.03.19
8주차 WIL  (0) 2023.03.12
7주차 WIL  (0) 2023.03.05
728x90
반응형
SMALL

aws 계정이 정지당했습니다....(빠른 복구를 해주길...ㅠㅠ)
어제 정지를 당해서 진짜... 울면서 다른 계정으로 급하게 서버를 띄우고 다시 codedeploy를 적용하는 과정을 거쳤습니다.
진짜 명령어를 정리해야할 필요를 느껴서 정리를 했습니다.
그리고 nginx에 대해 더 깊이 알아야할 필요성을 느껴 정리를 했고, 이 내용은 블로그에 따로 정리를 할 예정입니다.

중간발표를 하기 까지 완성된 부분이 거의 없기 때문에 조원들이 다 예민한 상태였고, 발표 후에 레디스 서버에 설치 후 이메일 인증 성공하고 회의 후에 합칠려고 하는데... 계정이 정지당해서 그야말로 멘붕이 왔습니다.

저에게 메일을 보내주세요...awsㅠㅠㅠㅠ

요즘 TIL을 쓰지 못해서 공부하고 성공하고 실패한 기록들을 간간히 올리고 있습니다.
지금은 메세지와 알림을 웹소캣을 이용해서 구현을 하면서, nginx를 연결을 해보고 있습니다.

리눅스 명령어의 정리가 필요함을 느낀것도 이 때문입니다. 

Ubuntu codedeploy 명령어

  1. sudo apt-get update: 이 명령어는 시스템의 패키지 정보를 업데이트합니다.
  2. sudo apt-get install ruby-full: 이 명령어는 Ruby를 설치합니다. CodeDeploy는 Ruby를 사용하기 때문에 이 명령어는 필수입니다.
  3. sudo apt-get install wget: 이 명령어는 wget을 설치합니다. CodeDeploy의 설치 스크립트를 다운로드하기 위해 필요합니다.
  4. wget https://aws-codedeploy-<region>.s3.<region>.amazonaws.com/latest/install: 이 명령어는 CodeDeploy의 설치 스크립트를 다운로드합니다. <region>은 원하는 AWS 지역에 대한 값으로 대체해야 합니다.
  5. chmod +x ./install: 이 명령어는 설치 스크립트에 실행 권한을 부여합니다.
  6. sudo ./install auto: 이 명령어는 CodeDeploy를 설치합니다. 이때, sudo 권한이 필요하며 설치 스크립트에서 자동으로 필요한 구성을 수행합니다.
  7. sudo service codedeploy-agent status: 이 명령어는 CodeDeploy 에이전트가 실행 중인지 확인합니다. 실행 중이라면, 설치가 올바르게 완료된 것입니다.

이러한 명령어를 실행하면 Ubuntu에서 CodeDeploy를 설치하고 구성할 수 있습니다.


무중단 배포 구조

  1. 하나의 EC2서버에 하나의 NGINX와 2대의 스프링부트 서브를 이용하는 것
  2. 클라이언트의 요청을 NGINX가 받아서 8081port로 넘겨준다
  3. 신규 버전이 나오면 8082 포트로 배포한다. 정상 구동이 확인되면, NGINX를 reload한다음에 8082포트를 바라보게 만든다무중단 배포 테스트용 Controller를 만들어준다application.properties에 profile 추가해보기localhost에서 구동 후, "/profile" API를 실행시키면 아래와 같이 나온다WebSecurityConfig에 URI 권한 설정해주기filezila에서 app폴더 만들어주기 app 폴더 안에 config폴더 만들어주기config 폴더 안에 prod-application.yaml파일을 생성해준다. —-를 통해서 여러개의 profile을 만들어줄 수 있다. 8081로 동작하는 set1과 8082로 동작하는 set2를 만들어준다스프링 프로젝트의 Build파일을 app폴더에 옮겨주기명령어를 통해 jar를 실행시켜준다. 이때 뒤에 특정 port로 실행시키기 위한 명령어가 따라 붙는다먼저 자바를 설치해준다그다음 nginx를 설치 및 실행한다nginx는 80번 포트로 구동되기 때문에 ec2에서 80포트를 열어준다 ec2 서버에 접속시 아래처럼 뜨면 성공.

    스프링부트 세팅

    import lombok.RequiredArgsConstructor;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.Arrays;
    
    @RestController
    @RequiredArgsConstructor
    public class ProfileController {
        private final Environment env;
    
        //현재 어떤 포트로 돌아가는지 확인용. set1 = 8081, set2 = 8082
        @GetMapping("/profile")
        public String profile() {
            //현재 동작중인 프로파일의 이름을 반환
            return Arrays.stream(env.getActiveProfiles()).findFirst().orElse("");
        }
    
        //무중단배포 테스트를 위한 version 확인용. 새로고침하면 return 값이 자동으로 바뀌는지
        @GetMapping("/version")
        public String checkVersion() {
            return "ver2";
        }
    
    }
    
    spring.profiles.active=local
    
    	nohup java -jar Joopging-0.0.1-SNAPSHOT.jar --spring.config.location=file:config/prod-application.yaml --spring.profiles.active=set1 &
    
    NGINX 설치 및 실행
    sudo apt-get install nginx
    
    sudo service nginx start
    
    sudo service nginx status
    
    Nginx의 포트를 80에서 8080으로 변경
    http {
        server {
            listen 8080;
            server_name example.com;
            
            ...
        }
    }
    
    설정 파일 저장 후 Nginx 재시작
  4. sudo systemctl restart nginx
  5. sudo nano /etc/nginx/nginx.conf
  6. Nginx가 받은 요청을 스프링서버가 열린 port로 보내주는 설정하기
  7. # 업데이트 해주기 sudo apt-get update # 자바 설치 sudo apt-get install openjdk-8-jdk # 자바 버전 확인 java -version
  8. --- spring: config: activate: on-profile: set1 datasource: url: jdbc:mysql://joopging-database-1.cjamvr086z6d.ap-northeast-2.rds.amazonaws.com:3306/Joopging_Database_1 username: admin password: joopging1029 jpa: hibernate: ddl-auto: update jackson: serialization: fail-on-empty-beans: false jwt: token: key: skldjficmnwl123kclknmcnfklsdkskmxxfofohue; server: port: 8081 --- spring: config: activate: on-profile: set2 datasource: url: jdbc:mysql://joopging-database-1.cjamvr086z6d.ap-northeast-2.rds.amazonaws.com:3306/Joopging_Database_1 username: admin password: joopging1029 jpa: hibernate: ddl-auto: update jackson: serialization: fail-on-empty-beans: false jwt: token: key: skldjficmnwl123kclknmcnfklsdkskmxxfofohue; server: port: 8082
  9. ec2 서버에 prod-application.yaml 만들어주기
  10. //nginx관련 .antMatchers("/profile").permitAll() .antMatchers("/actuator/**").permitAll() .antMatchers("/health").permitAll() .antMatchers("/version").permitAll()
728x90
반응형
LIST

'일상 > WIL' 카테고리의 다른 글

11주차 WIL  (0) 2023.04.09
9주차 WIL  (0) 2023.03.26
8주차 TIL  (0) 2023.03.19
8주차 WIL  (0) 2023.03.12
7주차 WIL  (0) 2023.03.05
728x90
반응형
SMALL

75일, 76일, 77일 TIL을 써야했는데, 시간이 없어서 못올렸습니다.

75일 ~ 77일까지 
트러블 슈팅 

http -> https 바꾸는 과정에서 에러..

github action 은 성공했으나.. codedeploy 배포에서 실패..

티켓과 댓글을 구현하는 과정에서 티켓 위에 태스크와 프로젝트가 또 있기 때문에 아래 부분에 대해 고민을 많이했습니다.
api도 간단하게 만들기 위해서는 다른방법을 활용해야했습니다.

Required URI template variable 'commentId' for method parameter type Long is not present]
2023-03-26 20:23:56.819  WARN 7759 --- [nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingPathVariableException: Required URI template variable 'ticketId' for method parameter type Long is not present]

Missing URI template variable for method parameter of type int 에러

컨트롤러에서 URI템플릿에 해당하는 변수명이나 타입이 안맞는다는것 입니다.

@GetMapping("/{boardnum}")
public BoardVO readContent(@PathVariable int boardnum){
	return listService.findByBno(boardnum);
}

// 오류

 

URI 템플릿 "{ 변수 }" 와 PathVariable 에 같은 변수명을 써야합니다.

@GetMapping("/{boardnum}")
public BoardVO readContent(@PathVariable("boardnum") int bno){
	listService.findByBno(bno);

	return listService.findByBno(bno);
}

이런 방법과 

@Operation(summary = "ticket 생성", description = "Ticket 등록 post 메서드 체크")
	@PostMapping("/ticket")
	public ResponseEntity<?> createTicket(
		@AuthenticationPrincipal UserDetailsImpl userDetails,
		@Valid @RequestBody TicketRequestDto ticketRequestDto) {
		return ticketService.createTicket(userDetails.getUser(), ticketRequestDto);
	}

이런방법을 사용할 수 있다.

진짜.. 지금 약 2주가 다되가는데..
압박감과 부담감이.. 많이 심해서.. 거기다 부팀장까지.. 
벌써 구현 다 해야할 걸 못하고 있습니다...
시간도 많이 투자하는데 정말 지난 프로젝트에 비해 제가 너무 느리다는게 보입니다...
진짜로... 해야할게 너무 많아서 하나라도 제대로 끝낸게 없어서 너무 슬픕니다 ㅠㅠ

 

728x90
반응형
LIST

'일상 > WIL' 카테고리의 다른 글

11주차 WIL  (0) 2023.04.09
10주차 WIL  (0) 2023.04.03
8주차 TIL  (0) 2023.03.19
8주차 WIL  (0) 2023.03.12
7주차 WIL  (0) 2023.03.05

+ Recent posts