분류 전체보기 (22) 썸네일형 리스트형 [CI/CD] (5) CD 구축하기 - GitHub Actions 앞서 AWS EC2, S3, CodeAgent까지는 설정을 완료했고, 마지막으로 github workflow와 appspec.yml 그리고 실행한 script 파일을 완성하여 CICD 파이프라인 구축을 마쳐보겠습니다. 1. appspec.yml version: 0.0 os: linux files: - source: / # Repository(S3) destination: /home/ubuntu/app # EC2 instance permission: - object: /home/ubuntu/app/ owner: ubuntu group: ubuntu mode: 755 hooks: ApplicationStart: - location: deploy.sh timeout: 60 runas: root appspec... [CI/CD] (4) CD 구축하기 - AWS [CI/CD] (3) 설정 총정리에서 정리한 내용을 직접 구현하고, CI/CD 구축을 마무리해보겠습니다. 1. AWS EC2 EC2 인스턴스 생성에 대한 자세한 내용은 아래 글 혹은 기타 EC2 생성 관련 글을 참고하시면 됩니다. 이번 프로젝트에서는 Ubuntu 20.04 버전을 이용했습니다. https://lback.tistory.com/4 (1) IAM 역할 부여 S3와 CodeDeploy에 대한 접근 권한을 부여하는 과정입니다. 위와 같이 설정하면 됩니다. 이렇게 생성한 IAM 역할을 EC2에 부여하면 됩니다. AWS 콘솔 - EC2 - 인스턴스 이름 우클릭 - 보안 - IAM 역할 수정 (2) JDK, CodeDeploy Agent 설치 JDK는 자신의 프로젝트에 맞는 버전을 설치하면 됩니다. 자.. [CI/CD] (3) 설정 총정리 앞서 개념적인 흐름에 대해서는 살펴보았고, GitHub Actions와 AWS CodeDeploy를 통해 CI/CD 프로세스를 구축하기 위한 설정을 전체적으로 정리해보겠습니다. 이번 글을 통해 개념적으로 정리하고, 이어지는 글에서 직접 구축하는 과정을 자세히 정리하겠습니다. 전체적으로 정리하면 위 그림과 같고, 여기에서 EC2 -> S3 -> CodeDeploy -> GitHut Actions 의 순서대로 하나하나 어떤 설정을 해주어야 하는지 살펴보겠습니다. 1. EC2 (0) EC2 생성 먼저 서비스를 배포할 EC2 인스턴스를 생성합니다. (1) IAM 역할 부여 EC2에 S3 저장소와 CodeDeploy를 이용할 것이기 때문에, 2개에 대한 권한을 가진 역할을 부여해야 합니다. (2) JDK, Cod.. [CI/CD] (2) CD 흐름 파악하기(AWS Code Deploy) https://lback.tistory.com/19 GitHub Actions를 통해 CI를 구축한 것에 이어서 GitHub Actions + AWS Code Deploy를 통해 CD를 구축해보겠습니다. 1. 배포 구조 GitHub Actions와 AWS Code Deploy를 통해 CI/CD 파이프라인을 구착하는 전체적인 구조는 다음과 같습니다. 각각의 역할을 먼저 살펴보겠습니다. GitHub(GitHut Actions) Master Branch로 push 이벤트가 발생하면, GitHub Actions에 정의한 workflow에 따라 배포 프로세스를 진행합니다. AWS S3 - Repository 배포에 사용될 코드를 저장합니다. (S3를 사용하지 않고, GitHub를 Repository로 사용할 수도.. [CI/CD] (1) Github actions로 CI 구축하기 목표 다음을 목표로 CI/CD 파이프라인을 구축하고 있습니다. ① Master Branch로 pull request가 발생 시, 자동으로 build 및 테스트 수행 ② Master Branch로 push하는 경우, 자동으로 AWS EC2에서 서버 재실행 이번 글에서는 Github actions를 통해 기능 ①을 구현하는 과정을 정리해보겠습니다. 1. Github actions 현재 CI/CD를 구축하고자 하는 프로젝트가 큰 규모의 프로젝트가 아니기 때문에, 비교적 쉽게 배우고 적용할 수 있는 github actions를 통해 CI/CD 파이프라인을 구축하기로 했습니다. Github actions를 활용하면 특정 이벤트가 발생했을 때 수행할 작업들을 명시해주면 됩니다. ex) master로 PR이 발생하면.. [JPA] default_batch_fetch_size 동작 OneToMany 관계에서 N+1을 해결하기 위해 default_batch_fetch_size를 처음 접하게 되었습니다. 정리 글: https://lback.tistory.com/15 N+1 문제에 사용되는 원리는 위 글에 정리해두었지만, default_batch_fetch_size 자체의 동작에 대해 조금 더 살펴보겠습니다. 기본적인 동작 역시 위 글에 정리해두었지만, 의문이 들었던 점은 2가지 부분입니다. 1. default_batch_fetch_size가 적용되는 경우 먼저 default_batch_fetch_size가 적용되는 경우에 대해 명확히 알고 싶었습니다. 이에 대해서 찾아본 결과, 다음과 같은 설명을 찾을 수 있었습니다. 'N+1 문제를 해결하기 위해, 지연로딩 시 미리 batch 단위로.. [Git] 하나의 저장소에 여러 프로젝트 추가하기(subtree) 블로그에 사용되는 예제 코드를 깃허브에 저장하고 싶은데, 다 저장소로 생성하기에는 지저분해서 하나의 저장소에서 관리하고 싶었습니다. subtree 명령어를 이용하면 되는데, 매번 생성할 때마다 찾아보게 돼서 한번 정리해두겠습니다. (1) 프로젝트를 모아둘 저장소 생성 먼저 프로젝트를 모아둘 저장소를 생성합니다. 이후 로컬에서 git clone을 통해 저장소를 클론합니다. git clone https://github.com/[USERNAME]/[REPOSITORY_NAME].git (2) 예제 저장소 생성 다음으로 예제 코드를 또 별도의 저장소로 생성합니다. (3) subtree 사용 (1)에서 clone한 디렉토리로 이동한 후, 다음 명령어를 실행합니다. git subtree add --prefix=[하.. [JPA] N+1 해결하기 (2) - OneToMany ※ 본 글은 김영한 님의 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의를 수강하고 작성한 글입니다. [JPA] N+1 해결하기 를 통해 N+1 문제를 해결하는 방법을 다뤘었는데, ~ToOne인 경우만 다뤘습니다. ~ToOne인 경우엔 fetch join을 통해 N+1 문제를 해결할 수 있지만, OneToMany 관계에서는 fetch join 만으로 해결할 수 없습니다. 위와 같이 엔티티가 관계를 맺고 있을 때, Team의 목록을 불러오는 코드를 통해 문제상황과 해결책을 살펴보겠습니다. 전체 코드는 깃허브에 공유해두었습니다! 1. Fetch join의 문제점 먼저 ToOne 관계에서 했던 것처럼, fetch join을 한번 사용해보겠습니다. public List getTeams_v.. [REST API] 리스트를 JSON으로 반환할 때 주의할 점 강의를 보다가 REST API에서 리스트를 JSON 형태로 반환할 때 주의할 점을 새롭게 알게되어 정리해두겠습니다. 1. 문제 상황 간단하게 Person class를 작성하고, List을 반환하는 API를 작성해보겠습니다. @RestController @RequiredArgsConstructor public class MemberController { @GetMapping("/api/people") public List getMembers(){ Person person1 = new Person(1L, "david"); Person person2 = new Person(2L, "messi"); List list = new LinkedList(); list.add(person1); list.add(perso.. [JPA] 동적쿼리, QueryDSL JPA, QueyrDSL을 통해 동적쿼리를 다루는 방법에 대해 살펴보겠습니다. 전체 소스코드는 아래에서 확인하실 수 있습니다. (https://github.com/LimYooyeol/blog/tree/main/dynamic-query) 1. 동적쿼리가 필요한 상황 이번에도 간단하게 Member와 Team을 활용해서 문제 상황을 재현해보겠습니다. @Entity @Getter @Setter @ToString public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Long number; @ManyToOne(fetch = FetchType.LAZY.. 이전 1 2 3 다음