전체 글

성현이의 기술 블로그!
· Java
[문제 상황]프로그래머스 체육복문제를 풀고 채점해보니 몇개의 테스트코드에서 시간초과가 났다. [문제가 발생한 부분] for(int i=0;i 흔히 볼 수 있는 리스트를 순회하며 제거하는 코드라고 생각될 것이다.이제부터 어떤 문제점이 발생하였는지 알아보자[문제파악]단순 시간복잡도 문제인가? 생각하고 여러가지 시도를 해보았지만 해결할 수 없었다.결국 구글링을 하던 중, Java에서 컬렉션을 순회하는 동안 해당 컬렉션 구조가 변경되는 경우 ConcurrentModificationException이 발생할 수 있다는 사실을 알게되었다.즉 ConcurrentModificationException 예외는 주로 컬렉션을 직접 변경하고, 이 변경이 Iterator의 내부 상태와 일치하지 않을 때 발생한다. 문제의 원..
[Waht? 기술 소개 ]👀 CI/CD란?CI/CD는 개발부터 배포까지 프로세스를 자동화하고 소프트웨어를 빠르고 신뢰성 있게 제공할 수 있도록 지원하는 방법론이다.✨ CI(Continuous Integration)란?지속적인 통합이라는 뜻으로,  새롭게 작성한 코드가 PR 혹은 Push 되었을 때 자동으로 빌드 및 테스트를 거쳐 Main(dev) Repository에 병합되는 것을 의미✌️ CI의 2가지 Point1. 코드 변경사항을 주기적으로 빈번하게 merge예시) [A개발자], [B 개발자] 모두 a.js 파일을 작업 후 오랜 기간이 지나고 merge 하게 된다면!?오랫동안 꼬여버린 코드의 conflict를 해결하고 merge하는 시간이 오래 걸리게 된다.commit history관리가 어렵고, ..
안녕하세요! Meerket서비스 백엔드 팀원으로 활동중인 문성현입니다 ^_^저는 이 프로젝트에서 상품, 댓글 도메인 개발을 맡았고 현재는 CI/CD 파이프라인을 구축하고 있습니다.(저의 글의 전체적인 흐름은 [글을 쓴 배경(이유)] -> [주제에 대한 내용] -> [마무리(느낀점)] 순서로 이루어져 있습니다.)[글을 쓴 배경]웹의 역할은 데이터 CRUD이며 웹 개발은 결국 CRUD를 얼마나 효율적이고 사용자 친화적으로 제공하냐라고 생각합니다.개발을 해보시면 쉽게 느끼시겠지만 CRUD 중에서도 특히 READ 조회에 대한 리소스가 가장 많이 발생합니다.조회가 작동하지 않는다면 데이터 생성 수정을해도 사용자 입장에서는 확인할 수 없을테니까요..!이렇듯 이 글은 제가 맡았던 상품 도메인에서 Pagination을..
· Java.Spring
[문제 상황]여러분 모두 유명 공연 티케팅시 "이미 선택된 좌석입니다" 혹은대학교 수강신청을 하면서 분명히 신청을 눌렀는데 로딩이 걸리더니 마감이되버린 경험이 있을 것이다.분명히 신청버튼을 누를 때는 마감이아니였는데 마감이 되버린.. 이러한 문제를 "동시성 문제"라고 한다. 현재 내가 개발중인 서비스에는 공연 티켓 발급기능이 있다.이제는 내가 티켓을 사는 구매자가 아닌 구매자들의 요청을 대응하는 개발자이다.사용자들이 거의 동시에 티켓구매요청을 할 것이고 나는 남은 티켓 수에 일치하도록 티켓에 대한 요청을 수락하거나 거절해야한다.이러한 동시성 문제를 해결 할 수 있는 방법이 Lock이다.Lock 중에서도 비관적 락 그중에서도 X Lock을 사용했다.왜 이걸 사용했어요?? 까지 설명하면 글이 너무 길어질 것..
· 회고록
현재 나는 개발자들이라면 누구나 이용해본 "프로그래머스"에서 진행하는 백엔드교육에 참여하고 있다.9시~18시라는 다소 강압적인(?) 스케줄과 서류/코테/면접을 통해 선발된 열정많고 좋은 팀원들과 함께 프로젝트를 진행하면서 성장하는 것을 매일 느끼는 중이다.교육기간중 총 4번의 프로젝트가 진행되는데 1차 프로젝트는 간단한 CRUD 과제가 주어지며 개인별로 진행되어 매일 먹던 맛..이었다.하지만 2차 프로젝트는 본격적인 팀 협업으로 진행되었고 기획부터 구현까지(아직 배포계획은 미정이다) 체계적으로 진행되었다.약 2주 조금넘게 진행되었고 내일이 중간 발표날이다. 또 이 프로젝트를  코틀린으로 마이그레이션 하는 것이 3차 프로젝트이다.프로젝트를 관리하는 깃허브 링크를 첨부하겠다https://github.com/..
· Java.Spring
[글을 쓰는 이유]평상시 나는 아무런 생각없이 Jpa를 이용해 연관 객체들을 조회했었다.그러다 팀원의 코드리뷰를 계기로 N+1 문제에 대해 공부하였고 간단하지만 실제 내가 만들었던 코드에 직접 적용하고 기록하고자 이글을 쓴다. [Jpa N+1문제란?]요청이 1개의 쿼리로 처리 되길 바랬는데 N개의 추가 쿼리가 발생하는 현상이다.조금 더 자세히 설명해보자면  Jpa를 사용해서 연관관계가 설정되어 있는 엔티티를 조회할 때 조회된 데이터 개수(N) 만큼 N개의 연관관계의 쿼리가 추가로 발생하는 것을 말한다.(만약 데이터가 백만개라면 ->  한번 조회로 백만개의 쿼리가 생성될 것이다..!) [문제상황]엔티티 구성과 연관관계를 설명하기 위해 ERD를 첨부하겠다. Coffee 테이블 == Product 엔티티이다...
· Java.Spring
[글을 쓰는 이유]지금까지 엔티티 혹은 여러 클래스를 구현하면서 이유나 근거없이 무조건적으로 @Setter 어노테이션을 사용하였다.최근에 Builder pattern에 대해 알게 되면서,단순 기능구현에 급급하여 생각없이 짰던 옛날 코드를 보며 반성하고무분별한 Setter사용 대신 더 객체지향적인 방법으로 객체 필드 값을 다루는 방법에대해 알아보자!  [Builder Pattern]빌더 패턴 == 생성과 관련된 디자인 패턴으로, 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법이러한 진부한 정의 말고 builder pattern을 이해하기 쉽게 비유하는 표현이 있어서 인용하겠다.바로 내가 좋아하는 "써브웨이"이다. 써브웨이는 주문할 때 방부터 , 패티, 재료까지 주문하는 사람이 마음대로 결정한다..
· Git
[글을 쓴 배경]개발자로서 git 충돌을 피할 수는 없다. 협업 과정에서  conflict를 경험을 자주 경험하였지만, 왜 충돌이 났는지, 해결방법이 무엇인지 정확히 알지 못한체 구글링이나 챗 GPT 도움으로 해결했었다. 그러다 보니 같은 실수를 반복하게 되는게 싫어서 이 글을 쓴다.피할 수 없으면 즐겨보도록 하자..! [충돌이 일어나는 이유]충돌 원인은 정말 다양하겠지만, 모두 대비하기는 불가능하고 가장 대표적인 충돌 상황을 정리하겠다.더보기바로 동일 파일을 다른 브랜치에서 수정한 경우이다.사실 아무리 다른 브랜치에서 작업을 하고 커밋이 꼬였다 하더라도, 서로 다른 부분만 코딩했으면 충돌이 나지 않는다..!그러니 서로 커뮤니케이션을 통해 기능구현 분업을 확실하게 하는것이 제일 중요하다![충돌 상황 직접..
네카라쿠배
#Not_Defined