전체 글77 우리FISA 클라우드 서비스 개발 - Spring Boot 어플리케이션에서 RDS MySQL 이중화 DB Replication 읽기 부하분산과 데이터 백업을 위해 데이터베이스 이중화를 진행했다. 개발환경은 아래와 같다. Spring boot 2.7.14 MySQL 8.0.33 (RDS) Spring Data JPA RDS 설정 현재는 이미 복제가 완료 되었지만, 손쉽게 진행할 수 있다. 버튼 하나만 누르면 Master DB와 DB 계정과 데이터부터 보안그룹까지 똑같은 환경으로 복제된다. Master DB는 쓰기와 수정 전용, 복제본은 읽기 전용으로 활용한다. Spring application.yml 수정 spring: datasource: master: hikari: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://{master db u.. 2023. 8. 29. 우리FISA 클라우드 서비스 개발 - 프로젝트 시작 전 CI/CD 파이프라인 만들기 Jenkins & docker CI/CD 파이프라인 지난 포스팅에서는 docker 위에서 실행되는 Jenkins를 활용해서 Spring Boot 애플리케이션을 배포했다. 이번에는 Jenkins환경은 같지만, Docker에서 실행되는 Spring Boot 어플리케이션에 대해서 CI/CD 파이프라인을 구축해 보겠다. EC2 서버에 Docker 설치 Docker sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/ap.. 2023. 8. 20. 우리FISA 클라우드 서비스 개발 - 프로젝트 시작과 프로젝트 산출물 프로젝트 시작 기획 프로젝트가 본격적으로 시작되었다. 개발을 시작하기 앞서 각종 기획과 문서가 우리 팀을 가로막았다. 요구되는 산출물도 주에 3~4가지씩 되다 보니 꽤나 큰 부담이었다. 마침 월요일 화요일에 우리의 기획을 돕고자 Design Thinking에 대해 잠시나마 알 수 있는 시간을 가졌다. 처음에는 별 기대 안했지만, 오히려 팀 빌딩이 되고 바로 했으면 더 좋았을 것이라는 생각이 들 정도로 도움이 많이 되었다. 공감이 무엇인지 여러 사람들과 토론 후 강사님이 내린 결론이다. 서비스를 기획하는 과정에서 사용자를 생각해서 더 좋은 서비스를 생각해 보자는 취지였다. 하지만 기획과 개발뿐만 아니라 평소에도 중요한 요소인 것 같다. 문서화 요구되는 문서는 요구사항 정의서 비즈니스 프로세스모델 WBS (.. 2023. 8. 13. 우리FISA 클라우드 서비스 개발 - Spring Framework에서 테스트 프로젝트 요구사항에 단위 테스트에 대한 요구사항이 있었다. 오늘 팀원들과 함께 스프링 부트로 만든 게시판 예제를 활용해서 단위테스트를 정리해 봤다. 스프링의 비즈니스 로직은 크게 Controller, Service, Repository에 존재하기 때문에 이 세 가지에 대한 단위 테스트를 정리하려고 한다. 테스트 환경 Java 11 Spring boot 2.7.13 Spring Data JPA JUnit 5.8.2 H2 2.1.214 Repository 우리 팀은 JPA를 사용할 예정이기 때문에 @DataJpaTest를 사용해서 테스트를 하려고 한다. 아직 복잡한 비즈니스로직이 없기 때문에 간단하게 하겠다. import static org.assertj.core.api.Assertions.*; import.. 2023. 8. 6. 우리FISA 클라우드 서비스 개발 - EC2, Docker, Jenkins를 사용한 Spring-boot 어플리케이션 배포 CI/CD 파이프라인 구축 수업에서 Jenkins를 활용해 Spring 어플리케이션을 배포했다. 프로젝트 진행 시 설정 정보가 담겨있는 application.yml은 보통 git에 올리지 않고 따로 관리한다. 이때 어떻게 배포할지 고민했고, 아래의 과정으로 application.ymlgithub에 올리지 않고, CI/CD 파이프 라인을 구축해보자. Docker 설치 sudo apt update sudo apt-get install ca-certificates curl gnupg Add Docker’s official GPG key: sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg.. 2023. 7. 30. Java Optional Optional 개발 배경 자바로 프로그램을 개발하면서 NullPointerException을 겪지 않은 사람은 없다. public class Person { private Car car; public Car getCar() { return this.car; } } public class Car { private Insurance insurance; public Insurance getInsurance() { return this.insurance; } } public class Insurance { private String name; public String getName() { return this.name; } } Null을 체크하는 방법 public String getInsuranceName(P.. 2023. 6. 14. [Vue.js] 리스트 렌더링과 Key 리스트 렌더링 v-for v-for 디렉티브를 사용하여 일반 배열, 객체 배열 등 리스트 렌더링을 할 수 있다. {{ fruit }} 숫자 범위에 활용 {{ i }} v-if와 v-for v-if와 v-for를 함께 사용할 수 있지만 권장되지 않는다. v-if가 v-for보다 우선순위가 높기 때문에 v-if에서 v-for변수에 접근할 수 없다. // bad practice {{ todo.name }} // good practice {{ todo.name }} key를 통한 상태유지 Vue가 v-for로 렌더링 된 리스트를 업데이트할 때, 기본적으로 in-place patch 전략을 사용한다. 리스트 아이템의 순서가 변경된 경우, 아이템의 순서와 일치하도록 DOM 엘리먼트를 이동하는 대신, 변경이 필요한 .. 2023. 5. 9. [LeetCode] Valid Sudoku (Kotlin) https://leetcode.com/problems/valid-sudoku 스도쿠 문제이다. 완전탐색으로 해결했지만, 흥미로운 풀이가 있어 공유하려고 한다. 우선 처음 내가 푼 풀이는 완전탐색을 해서 col, row, sub-box를 검사하는 것이다. 또한, 방문했던 col, row, sub-box는 체크를 해서 시간을 줄이려고 했다. lateinit var visit: Array lateinit var col: BooleanArray lateinit var row: BooleanArray val set: HashSet = hashSetOf() fun isValidSudoku(board: Array): Boolean { visit = Array(3) { BooleanArray(3) } col = Boo.. 2023. 3. 18. 웹 브라우저에 URL을 입력한다면? 웹 브라우저에 URL을 입력한다면 사용자가 입력한 URL을 파싱한다. 입력한 URL에서 프로토콜, 호스트명, 포트번호, 경로, 쿼리 스트링 등을 파싱한다. DNS를 조회한다. 호스트명을 IP 주소로 변환하기 위해 DNS 서버에 호스트명을 조회한다. DNS는 복잡하고 빨라야 하기 때문에 DNS 데이터는 웹 브라우저 사이의 서로 다른 계층과 인터넷의 다양한 위치에 임시로 캐시를 저장한다. 웹 브라우저는 고유한 캐시, 운영체제 캐시, 라우터의 로컬 네트워크 캐시, 회사 네트워크 또는 인터넷 서비스 제공업체(ISP)의 DNS 서버 캐시를 확인한다. 만약 웹 브라우저 캐시 계층에서 IP 주소를 찾을 수 없는 경우 회사 네트워크 또는 ISP의 DNS 서버가 재귀적으로 DNS 조회를 수행한다. 웹 브라우저가 서버와 .. 2023. 3. 12. 이전 1 2 3 4 ··· 9 다음