[Project] 멀티모듈로 분리하기
·
프로젝트
단기 집중개발로 개인 프로젝트를 마무리 후 미흡했던 부분을 보완하거나 개선하는 작업을 진행하고 있다. 테스트 코드 작성이나 프론트엔드 구현 등 작업들이 남아있지만, 가장 하고싶었던건 프로젝트를 레이어 별 멀티모듈로 분리하는 작업이었다. 최근 강의와 유튜브 영상에서 멀티 모듈로 나눈 코드로 시연하는걸 보고 나도 한 번 해보고 싶은게 컸다. 마침 프로젝트 개선 사항에도 부합했기 때문에 진행하기로 결정했고 분리했던 과정을 간략히 기록했다.1. 배경 및 동기현재 프로젝트는 단일 모듈로 구성해 기능과 역할별 패키지를 분리했다. 각 레이어간 역할 및 구조를 명확히 분리하기 위해 레이어 별 멀티 모듈 형태로 구조를 변경했다.// 기존 구조arcademarket(proejct root)├─ docs(문서 모음)├─ ...
[Project] 나혼자 해커톤 후기 - 2
·
프로젝트
지난번 진행했던 개인 프로젝트를 이어서 완성했다(지난 작업 후기). 이번에도 주말동안 약 12시간동안 작업하며 미흡했던 부분을 보완하고 새로운 기능을 개발했다.작업이번에는 타이머를 12시간으로 맞추고 1시간이 남을 때 까지 작업했다. 핵심 기능을 어느정도 완료하고나니 집중력이 떨어져서 후반에 남아있던 프론트엔드 작업은 완성하지 못하고 마무리했다. 작업을 하면서 노트에 완료한 시간을 기록하긴 했는데 정확하진 않다.통계총 작업시간 : 약 11시간커밋 수: 94(+57)Java 파일: 128개(+77)Vue 파일: 13개(+4)Typescript 파일: 47개(지난번 카운트를 잘못했는지 수가 줄었다.)지난번에 완료한 기능회원 : 회원 가입, 회원 기본정보 조회, 로그인 및 인증아이템 마스터 : 정보 등록 및 ..
[Project] 나혼자 해커톤 후기 - 1
·
프로젝트
개요연휴동안 충분히 쉬기도 했고, 그동안 진행하던 개인프로젝트가 지지부진한 것 같아 리프레시할 겸 새로운 단기 프로젝트가 하고 싶었다. 주말동안 시간을 정하고(10시간) 완성해보자는 생각으로 Arcade Market이란 프로젝트를 시작했다. 너무 참신한 아이디어를 내기는 어려울 것 같아 포인트로 아이템을 거래하는 플랫폼을 주제로 진행했다.토요일 오전부터 바로 개발에 들어갈 수 있게 PRD, 유저플로우 문서를 작성했다. AI의 도움을 받아가며 초안을 작성할 수 있었다. 개발할 때 필요할 것 같은 기능상세정의 문서는 대략 템플릿 정도만 만들어두고 개발하면서 바로 AI 생성이 가능하게끔 준비했다. 목요일 퇴근 후, 금요일 출근 전에 약 1~2시간 정도 소요된 것 같다.계획은 백엔드, 프론트엔드 모두 개발할 생..
[JPA] 엔티티의 equals()와 hashCode()
·
Spring Framework/JPA
개요이전 포스팅에서 자바의 동등성(Equality)과 동일성(Identity), 그리고 equals()와 hashCode() 메서드에 대해 정리했다. 일반 자바 객체에서는 객체의 논리적 동등성을 판단하는 데 필요한 핵심 필드들을 선택하여 이 두 메서드를 오버라이딩한다.하지만 JPA 엔티티는 일반 객체와 다른 특성을 가지고 있어 주의가 필요하다:영속성 컨텍스트 관리: 같은 엔티티라도 다른 시점에 조회하면 다른 인스턴스일 수 있다프록시 객체: 지연 로딩 시 실제 엔티티가 프록시로 감싸진다ID 할당 시점: @GeneratedValue 사용 시 엔티티 생성 시점에는 ID가 null이고, persist 호출 후에야 ID가 할당된다이러한 특성으로 인해 JPA 엔티티에서는 equals()와 hashCode() 구현에..
[JPA] N+1 문제
·
Spring Framework/JPA
N+1 문제란 ORM 사용 시 발생하는 대표적인 성능 이슈부모 엔티티를 조회하는 1번의 쿼리 후, 각 부모마다 연관된 자식 엔티티를 조회하는 N번의 추가 쿼리가 실행되는 현상예시: 100개의 게시물과 댓글 있을 때게시글 전체 조회: 1번 + 각 게시글의 댓글 조회: 100번 ⇒ 총 101번의 쿼리가 실행모든 정보를 한 번의 쿼리로 가져오지 못하고 추가 쿼리로 인해 성능 이슈가 발생한다.문제 상황게시물(Post), 댓글(Comment) 엔티티가 있다.(이외의 테이블은 없다고 가정)게시물 목록 조회 시 각 게시물의 댓글 갯수를 함께 조회하고 싶다.@Entity@Table(name = "post")@NoArgsConstructor(access = AccessLevel.PROTECTED)@Getterpublic..
[Spring] tomcat 설정의 동작 원리(max-connections, accept-count, threads.max)
·
Spring Framework/Spring
Spring Boot로 웹 애플리케이션을 개발하면서 application.yml에 있는 Tomcat 설정들을 본적은 있지만 별 생각 없이 무심하게 지나쳤다. 하지만 이 설정들이 정확히 무엇을 의미하고, 어떤 역할을 하는지 궁금해 졌다.server: tomcat: max-connections: 8192 accept-count: 100 threads: max: 200본 포스팅에서는 Tomcat의 세 가지 핵심 설정인 accept-count, max-connections, threads.max가 클라이언트 요청을 처리하는 과정에서 각각 어떤 역할을 하는지 정리했다.설정들의 역할그 전에 알아야 할 것HTTP는 TCP를 기반으로 동작한다클라이언트와 서버간 연결을 위해 3-hand-sha..
[Spring] 트랜잭션과 동시성
·
Spring Framework/Spring
처음 Spring을 공부할 때 감명받은 기능 중 하나가 @Transcational이었다. 애너테이션만 붙여주면 일일히 커넥션을 열고 커서를 가져오고 작업하고 리소스를 닫는 등 번거로운 작업들이 알아서 적용되니 정말 편리했다. 그러다보니 트랜잭션이 필요한 곳에서는 관성적으로 @Transactional를 추가하고 모든 문제가 해결됐다고 생각했다. 하지만 서비스 환경에서 멀티 스레드 상황이라면 문제가 생길 수 있다.트랜잭션, 격리 수준, 락킹, 동시성 제어 등 여러 용어들은 많이 들어보고, 또 알고 있다고 생각했지만 각각의 개념이 서로 연결되지 않은 느낌이 들었다. 동시성 제어에 대해 다시 공부를 시작하면서 차근차근 정리해나가려고한다. 우선은 가장 기본적인 트랜잭션과 @Transactional에 대해 포스팅을..
[Project] 4dollar - 헥사고날 아키텍처에서 패키지 구조 전환
·
프로젝트
개요사이드 프로젝트를 시작하면서 새로운 아키텍처를 사용하고 싶었다. 지금까지는 레이어드 아키텍처를 쓰거나, 진행중인 프로젝트의 기존 규칙을 따르기만해서 패키지 구조에 대해 깊이 고민한 경험이 없었다. 새로 시작하는 프로젝트인만큼 멋진 구조를 만들고 싶어서 유튜브나 책에서 많이 접해봤던 헥사고날 아키텍처를 도입했다. 직접 사용해보는건 처음이라 공부하면서 진행하느라 조금 엉성한 느낌은 있었지만 나름 적절히 적용할 수 있었다. 하지만 개발을 진행하면서 몇몇 불편한 부분이 생겨서 새로운 구조로 전환했다. 더 개선할 여지는 있지만 아직까지는 문제 없다고 생각한다. 기존 패키지 구조에서 어떤 문제점을 경험했는지, 새로운 패키지구조에 대한 고민과 어떤 부분을 변경했는지 포스팅을 남긴다.기술 스택: Java, Spri..