개발 24

항해 플러스 백엔드 (2주차 WIL)

2주차 WIL 2주차 KPT를 정리합니다.    1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) 요구사항아키텍처 준수를 위한 애프리케이션 패키지 설계동시성을 고려한 특강 조회 및 신청 API 서버 구현 1주차와 마찬가지로 단순 기능 구현에 대한 어려움은 없었습니다. 하지만 다른 온라인 강의를 통해 보기좋은 패키지 설계에 대해 살짝만 알았을 뿐DIP와 OCP를 준수하기 위한 노력은 하지 안았기에 구조 자체를 잡게 너무 어려웠습니다. 또한 이전엔 애플리케이션단에서의 Lock을 구현했다면, 다중 인스턴스에서의 동시성 제어를 위해DB Lock과 Redis를 사용했는데 둘 다 고민을 크게 하지 않고 사용했던터라 어려움을 많이 겪었습니다. 2. 시도 공개 Q&A에서 힌트를 얻어 다음과 같이 패키지..

개발/항해99 2024.10.09

항해 플러스 백엔드 (1주차 WIL)

1주차 WIL 9월 21일 항해 플러스를 시작으로 1주간의 KPT를 정리합니다.    1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) PointService를 정상 동작하게 구현하는 Default 과제는 어렵지 않게 해결했습니다. 이후 Step1~Step2인 동시성 제어에서 다뤄본 적이 없었기에 어떠한 방법을 사용해야 하는지전혀 감이 오지 않았습니다. 공개 Q&A 덕분에 ConcurrentHashMap과 Lock에 대한 Keyword를 얻었지만동시성, 순차성 등 용어의 혼선으로 실패만 되는 테스트 케이스에 부딪혔습니다. 2. 시도 처음엔 UserId와 UserPoint 객체를 가지는 ConcurrentHashMap만을 사용하여 로직을 구현하였습니다. 하지만 이는 순차성을 보장할 순 없었..

개발/항해99 2024.09.28

백엔드 6기 WIL (시작하는 마음)

지금까지의 회고당연히 핑계겠지만 개발에 대한 욕심만 있고 SI 특성상 성장하기 힘든 환경탓만 해왔습니다. 정말 성장하고 싶지만 전공자도 아니고, 주변에 도움을 받을 수 있는 사람도 없기에 항상 "어떻게?"가 저의 발목을 붙잡았고 그 핑계로 일만 열심히 하는 성실한 노예가 되었습니다. 성실한 노예가 된 덕분에 회사에서의 인정과 작은 규모의 기업에서는 드문 파격적인 연봉 인상도 받았습니다. 그렇게 1년이 지난 지금 사내 에이스라는 정말 작은 우물안에 갇혀 폐사 직전의 왕자 개구리가 되었습니다. 항해플러스 참여 계기그러던 와중 우연히 광고 배너를 통해 항해99 알고리즘 스터디에 참여하게 되었고 성장에 대한 방향성을 몰라 그저 제자리에 서있던 저에게 아주 큰 동기부여가 되었고 40일간 TIL 전부 제출, 알고리..

개발/공부 2024.09.21

Github PR Status With Jenkins

SI 프로젝트 중 고객사 CI/CD 구축 환경 구성을 진행중에 있습니다. 모든 인프라는 AWS내 구성하였으며 대략적인 Workflow는 다음과 같습니다. 1. Github Create PR2. WebHook을 이용하여 Jenkins Job Triiger3. Job Triiger와 동시에 Github Status 생성 (Build, Test, Deploy 등 ..)4. Merge를 위한 조건으로는 Build, Sonarqube 분석 Pass5. Status All Pass시 Merge 버튼 활성화 이 중 2번과 3번을 해결하기 위해 Jenkins Plugin 중 Github PullRequest Builder를 사용하였으며Sonarqube에 대한 정적분석 결과를 PR Comment로 받기 위해 sonarq..

개발/CI_CD 2023.08.11

[Spring] json deserialize ClassCastException

내부 API 통신 중 T 타입으로 받은 DTO가 해당 DTO 객체가 아닌 LinkedHashMap으로 인식되는 문제를 겪었습니다. 이유를 찾아보니 WebClient의 bodyToMono(Class) 를 통해 역직렬화시 내부적으로 Jakson 라이브러리를 사용하며 json 데이터를 단순히 List로 지정시 "객체"가 어떤것인지 명확하게 알지못하기 때문에 기본 타입인 LinkedHashMap으로 변환하게 됩니다. 구글링에서 흔히 나오는 간단한 해결 방법은 다음과 같았습니다. ObjectMapper mapper = new ObjectMapper(); mapper.convertValue(타겟 클래스, new TypeReference()); 하지만 별도의 후처리가 번거롭다면 문제점 자체가 어떤 타입인지 명확히 알..

개발/Spring 2022.06.16

InvalidDefinitionException 에러

WebClient를 사용하여 크롤링할 데이터를 받는 도중 InvalidDefinitionException 에러가 발생했다. 에러 로그를 읽어보니 기본 생성자가 없다고 나오고 관련 검색을 해봐도 기본 생성자를 생성해봐라! 라는 답변이었다. 이는 불변 객체를 선언하고 싶은 나에게는 맞지 않는 해답이기 때문에 더 찾아보니 @JsonCreateor와 @JsonProperty를 사용하는 방법을 찾았고 다음과 같이 수정 후 정상 작동하는것을 확인했다. 참고 https://www.baeldung.com/jackson-deserialize-immutable-objects Deserialize Immutable Objects with Jackson | Baeldung Learn how to use Jackson to d..

개발/Spring 2022.06.08

[Docker] Ports are not available 에러

ERROR: for frontend Cannot start service frontend: Ports are not available: listen tcp 0.0.0.0:3306: bind: An attempt was made to access a socket in a way forbidden by its access permissions. Docker에 my-sql 올려놓고 사용중 어느날 갑자기 Ports are not available 에러가 발생했다. 문자 그대로 해석하면 해당 포트에 접근 권한이 없다고 나온다 (mysql 3306 포트) 검색해보니 어떤 이유인지는 모르겠으나 윈도우 자체에서 해당 포트를 막고있었는데 관리되는 포트는 netsh interface ipv4 show excludedpor..

개발/Docker 2022.05.27

Spring Data JPA - 2

패스트캠퍼스 강의를 보며 정리한 내용입니다. 1. @Repository persistence layer를 구현하는 클래스는 @Component와 마찬가지로 해당 클래스를 빈으로 등록해서 사용해야 합니다.@Repository로 등록을 하게되면 persistence layer에서 발생하는 에러를 DataAccessException으로 Spirng error로처리해주기 때문입니다. 하지만 JPA를 사용할 때 어노테이션 없이 extends 받는것만으로 사용하고 있는데 그 이유는 상속받는 JpaRepository의 구현체를 따라가보면 알 수 있습니다 따라서 Spring Data JPA를 사용하게 될 경우 직접 @Repository 어노테이션을 사용할 일은 없다고 봐도 무방합니다. JpaRepository의 상속 ..

개발/Spring 2022.02.25

Spring Data JPA - 1

1. JPA 개요 1-1. ORM Object Relational Mapping의 약자로 한글 해석은 객체 관계형 매핑입니다. 간단하게 말하면 관계형 데이터베이스의 테이블 데이터를 자바 객체와 매핑하는 기술을 뜻합니다. ORM을 통해 얻고자 하는 것들은 다음과 같습니다. 특정 DB에 종속된 표현이나 구현들을 할 필요가 없기에 DB 변경에 유연함. DB에 종속된 표현이 아닌 객체의 이점을 살릴 수 있기에 객체간 참조나 type-safety에 유리함. 연결 관리, 자원의 관리 등의 동작을 프레임워크에 맡겨 필요한 비즈니스 로직에만 집중할 수 있음. 1-2. JPA Jakarta(Java) Persistence API의 약자로 자바에서 ORM 기술을 활용하여 RDBMS를 다루기 위한 인터페이스의 집합입니다. ..

개발/Spring 2022.02.24

MSA(Micro Service Architecture) 아키텍처란?

취업을 준비하기 위해 구인 광고를 보다 보니 낯설지만 많은 회사가 원하는 경험이 있었는데 바로 MSA 경험이었다. (도메인 주도 설계는 MSA를 위한 설계 방법 중 하나로 포함했다) 다른 것과는 다르게 특정 기술로 보이진 않아 궁금증이 생겨 찾아보기 시작했다. MSA를 설명하기 전 기존의 방법인 모놀리틱 아키텍처를 그림으로 간략하게 그려보자면 아래와 같다. 모든 도메인이 묶여있고 하나의 DB만을 바라보고 있어 하나의 서비스에 대해서만 배포 및 테스트를 수행하면 되고 트랜잭션 또한 DB가 하나이니 서비스의 규모가 크지 않은 경우에는 MSA보다는 더 효율적이라고 할 수 있다. 만약, 서비스 규모가 커져 다음과 같은 상황이 발생한다면? 위 그림에서의 보이는 단점을 몇 가지만 살펴보자. 1. 작은 프로세스의 수..

개발/기술 2021.12.20