목록Back-end (10)
Hanbit the Developer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ckcelR/btsI5VU0ktH/6dgZg97h1wd6Pap3YKgXp1/img.png)
SSM 도입 배경이전 글까지의 과정으로 CI, Docker, ECR, IAM 설정을 완료했습니다. 이제 마지막으로 CD를 구축하면 됩니다.CD 파일을 통해 다음과 같은 동작을 수행하면 됩니다:Checkout GitHub Repository & Build docker images & Push docker images(EC2에서) Pull docker images & Deploy docker images이때 문제는 EC2에서 동작을 수행해야 한다는 점입니다. 이를 수행할 수 있는 방법에는 여러 가지가 있습니다:SSH: GitHub Actions가 실행되는 인스턴스의 IP가 고정된 범위가 아니기 때문에 SSH 보안그룹을 열어야 해서 보안에 매우 취약합니다.k8s + Jenkins + ArgoCD: 복잡한 파이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dO1ElK/btsI3QNp7Xw/SVRtkjHSjLmUfv2t4BdRq1/img.png)
ECR 도입 배경이전 글의 과정으로 Docker로 편하게 배포를 할 수 있었습니다. 이제 마지막으로 CD까지 도입하면 git main 코드가 변경되면 아무런 절차 없이 배포를 할 수 있습니다.다만 저는 보안성을 높이고자 Docker Hub 대신, AWS에서 제공하는 컨테이너 레지스트리인 ECR(Amazon Elastic Container)을 도입하고자 했습니다. 1. IAMECR을 사용하려면 IAM 서비스가 필요합니다. IAM(Identity and Access Management)은 AWS 리소스에 대한 접근을 안전하게 관리하는 권한 제어 서비스입니다.User먼저 User에 대해 알아야 합니다. IAM에서 User는 AWS 계정 내에서 특정 사용자를 나타내며, AWS 리소스에 접근할 수 있는 crede..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Pm7k4/btsI0QUjnx6/ZVOQZanZ41Fq4dKcTFsHn0/img.png)
Docker와 Docker Compose 도입이전 글의 과정으로 CI를 도입하니 Docker와 CD를 활용해 편하게 배포를 하고 싶어졌습니다. 우선 도커부터 도입하려고 합니다.Docker는 애플리케이션을 컨테이너화하여 어디서나 동일하게 동작할 수 있게 해줍니다. 저는 GitHub Action 환경, ec2 환경을 통해 배포를 해야하기 때문에 도커를 도입하기에 적절해 보였습니다. 또한 저의 경우 프론트엔드와 백엔드를 모두 관리해야 했기 때문에, Docker Compose를 도입하게 되었습니다.0. Docker 기본 개념도커 기본 개념을 간략히 설명하겠습니다.Dockerfile: 애플리케이션을 어떻게 실행할지를 정의합니다.Image: 실행 가능한 애플리케이션 패키지입니다.Container: 실제로 동작 중인..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dvbIsv/btsIZLmhBbx/mCu1z2SUS8loIAsevPjwC0/img.png)
배경처음에는 간단하게 EC2에 코드를 푸시하고, 수동으로 빌드하고, 배포를 하려고 했습니다. 수동 배포로 날리는 시간보다 관련 공부를 하고 적용하는 시간이 훨씬 길 것이라고 생각했기 때문입니다. 하지만 다시 생각해보니 수동 배포는 시간을 버리는 것인데 비해, CI/CD 도입 과정은 저에게 도움이 되는 유용한 시간이라고 생각하게 되어 이 여정을 시작하게 되었습니다.GitHub Actions CI 도입먼저 github에 PR을 올리면 테스트 코드를 자동으로 돌릴 수 있도록 CI(Continuous Integration)를 도입하기로 했습니다. GitHub Actions에 CI를 도입하기 위해선, .github/workflows/ci.yml 파일을 추가하고 remote에 푸시해야 합니다. 다음은 ci.yml의..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nu0tE/btsIUv9UWlX/kRw8hDJYf9cl4uKlOBSCu1/img.png)
기존 코드@PostMappingpublic ApiResponse createChat(@RequestBody Req req, @RequestHeader("Authorization") String authorization) { // 토큰 유효성 검증 if (!jwtUtil.validateAuthorizationHeader(authorization)) { throw new InvalidAuthorizationHeaderException(); } // 토큰에서 사용자 추출하기 String token = jwtUtil.extractTokenFromAuthorizationHeader(authorization); String username = jwtUtil.extract..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bNeBO4/btsIPuq1G6y/58aEOk1Bnjpn43K6XZ1oRK/img.png)
배경제가 테스트를 위한 데이터베이스를 따로 두었기 때문에 테스트 코드 클래스마다 아래와 같이 액티브 프로필을 변경하여 DB URL을 변경시켜줘야 했습니다.하지만 매번 @ActiveProfiles를 등록하는 것이 번거롭고 잊기 쉬워서 개선하고자 했습니다.어노테이션 정의아래와 같이 어노테이션을 정의해주었습니다.@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@SpringBootTest@ActiveProfiles("test")public @interface ChadTest {} @Retention정책에는 SOURCE, CLASS, RUNTIME가 있습니다. 런타임에 적용해야 하므로 RUNTIME을 지정해주었습니다@Target어노테이션을 붙일 수 있는..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/KoQcK/btsIPI3vwBo/msGdgjl7rxK04VAR3nYjU1/img.png)
개발 환경Front-end: https://localhost:3000(React.JS)Back-end: https://localhost:8080(Spring Boot 3.3.1) 배경응답을 받은 브라우저가 쿠키를 설정하게끔 response header에 Set-Cookie를 설정하였는데, Set-Cookie 헤더가 포함되지 않은 채로 응답이 전송되거나, Set-Cookie가 제대로 전달되었음에도 브라우저에 쿠키가 설정되지 않는 문제가 있었습니다. Spring Cookie 객체 초기화컨트롤러 코드입니다.@PostMapping("/set-cookie")public ResponseEntity> setCookie() { ResponseCookie cookie = ResponseCookie ...
[AWS]Free tier: 메모리 스왑(https://sundries-in-myidea.tistory.com/102)보안 규칙[In my pc]Ssh with pem: ssh -i secret.pem ubuntu@123.123.123.123[ssh]git 설정: https://qhdl0224.tistory.com/2 *주의 클론 시 git clone git@github.com:username/repository.git 형식Java 설치: sudo apt install openjdk-17-jdk환경변수 설정:1. nano ~/.bashrc -> export A=‘ABC’ -> source ~/.bashrc2. .env 파일 수정Spring Boot 배포빌드: sudo ./server/gradlew bui..
아래 코드에서 왜 굳이 PROTECTED로 access modifier를 두는 것이 권장되는가?@Entity@Table(name = "account")@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Account { @Id @GeneratedValue private long id; private String email; // ...}이유 1: JPA 요구사항JPA 문서에 의하면 entity 클래스는 public/protected no-argument constructor가 있어야 한다고 한다.• The class must have a public or protected, no-argument const..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/btzYjS/btq0PbUAXwG/IsWLLUwo5TE5t9AtUbF4kk/img.png)
로그인은 되는 것 같은데 노드메일러가 작동하지 않는 경우가 있다. 이를 위한 해결책이 보통은 다음의 것으로만 제시된다.https://myaccount.google.com/lesssecureapps 로그인 - Google 계정하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인accounts.google.com 하지만 밑의 방법도 동시에 시도해보아야 한다.https://accounts.google.com/DisplayUnlockCaptcha 로그인 - Google 계정하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인accounts.google.com