2025/10 10

💡API도 몰랐던 내가, 팀의 개발 문화를 고민하게 되기까지

🧩 첫 프로젝트 – React로 진행한 스터디 올인원 프로젝트개발을 처음 시작했을 때, REST API의 개념조차 제대로 이해하지 못한 상태였습니다.github도 처음 다뤄보는 상황이었기에, API 명세서를 봐도 무슨 말인지 몰랐고,백엔드 팀원에게 물어봐도 “명세서 보면 된다”는 답변만 들었습니다.(아마 그분도 프론트 연동 방식을 모르셔서 그랬던 것 같습니다.)그 결과, 프론트엔드와의 연동 과정에서 큰 어려움을 겪었고,이때 “전체 구조를 이해해야 제대로 개발할 수 있다”는 깨달음으로 백엔드를 공부하기 시작했습니다. 그래도 해당 프로젝트로 교내 SW 대회에서 우수상을 수상하며 첫 성취를 거둘 수 있었습니다.비록 연동에 어려움이 있었지만, 스스로 한계를 인식하고 개선 방향을 찾았다는 점에서저에게는 '개발자..

실시간 채팅에 커서 기반 페이지네이션 도입하기

이 글을 작성하게 된 이유이번 프로젝트에서는 gRPC 기반의 채팅 서비스를 새롭게 구현하면서, 이미지 전송까지 마무리한 뒤 PR을 올리고 뿌듯해하던 중,팀원으로부터 “페이징을 적용해보면 좋을 것 같다”는 코드 리뷰를 받았습니다.사실 저도 페이징을 고려하고 있었기에 “좋은 기회다” 싶어 성능 개선을 목표로 페이징을 직접 적용했습니다.그리고 여러 페이징 기법 중 어떤 방식을 선택했고, 왜 그렇게 결정했는지를 정리해두면 좋을 것 같아 이 글을 작성하게 되었습니다. 페이지네이션이란?검색결과를 가져올 때 데이터를 쪼개 번호를 매겨 일부만 가져오는 기법입니다. 왜 사용했는가?사용자가 채팅방에 들어올 때, 모든 채팅 내역을 한 번에 조회한다면 어떨까요?채팅이 10개, 20개 정도일 때는 큰 문제가 없지만, 내역이 1..

PROJECT 2025.10.18

트랜잭션(Transaction)

트랜잭션이란?"더이상 분할이 불가능한 업무처리의 단위"를 의미합니다. 하나의 작업을 위해 더이상 분할될 수 없는 명령들의 모음을 의미하며, 한꺼번에 수행되어야 할 일련의 연산모음을 의미합니다. 다음과 같은 상황이 있다고 가정해봅니다. 1. 친구들과 놀고 집에 온 민영이는 정산을 해야합니다. 유진이에게 3만원을 카카오페이를 사용하여 송금했습니다. 2. 그러나 내 통장에서는 3만원이 차감되었는데, 유진이 계좌에는 3만원이 입금되지 않았습니다. 위의 상황과 같이 만약 인출에는 성공했는데, 입금에 실패하면 치명적인 사고가 납니다.따라서 이 두 과정은 동시에 성공하던지 동시에 실패해야 합니다. 이 과정을 동시에 묶는 방법이 바로 트랜잭션입니다. START TRANSACTION 민영의 계좌로부터 인출 ..

CS/DB 2025.10.17

gRPC 채팅 스트림에서 트랜잭션이 적용되지 않았던 이유(feat. 자기 호출, 프록시)

🧩문제 상황 채팅방 목록을 조회할 때, 각 채팅방에 대해 가장 최근 메시지(latestMessage)와 그 시간(lastestTime)을 함께 보여줘야 했습니다.하지만 실제 화면에서는 최근 메시지가 표시되지 않는 문제가 발생했습니다. 🔍 초기 설계채팅 메시지를 보낼 때, 해당 채팅방의 최근 메시지 정보를 함께 업데이트하도록 설계했습니다.이를 위해 채팅 처리 메서드에 @Transactional을 붙이고, 내부에서 updateLatest()라는 메서드를 호출해 채팅방 정보를 갱신하도록했습니다. ⚠️ 이상 현상하지만 로그를 확인해보니 메시지 저장(INSERT)은 정상적으로 수행되었지만,채팅방의 최근 메시지 업데이트(UPDATE)는 실행되지 않았습니다.아래 쿼리를 보면 메시지를 inser..

PROJECT 2025.10.16

자료형(기본 자료형, 참조 자료형, Wrapper Class, 박싱과 언박싱)

기본 자료형자바에서 가장 기본적인 데이터 타입이며, 값 자체를 저장합니다. 정수형: byte, short, int, long실수형: float, double문자형: char논리형: boolean 기본 자료형은 메모리에서 고정된 크기의 공간을 차지하며, 실제 데이터 값을 저장합니다. 특징총 8가지의 기본형을 미리 정의하고 제공합니다.기본 자료형은 반드시 사용하기 전에 선언되어야 합니다.운영체제에 따라 자료형의 길이가 변하지 않습니다.값을 직접 저장하기 때문에 null을 허용하지 않습니다. 만약 기본형에 null을 넣고싶다면, Wrapper Class를 활용해야합니다.스택(Stack)메모리에 저장됩니다. 참조 자료형참조 자료형은 객체의 주소를 저장합니다.참조형은 Java에서 최상인 java.lang.Obje..

CS/Java 2025.10.15

Call By Value와 Call By Reference

Java는 기본적으로 모든 전달방식이 Call by Value입니다자바의 Call by Value 동작 방식 자바의 데이터 타입은 다음과 같이 크게 두가지로 나누어집니다. 원시타입(primitive type) - Numeric Type(byte, short, int,float, long, double, char), Boolean Type(boolean참조타입(reference type) - Class Type, Interface Type, Array Type, Enum Type, 기타 참조 타입(String 등)메서드 파라미터로 원시 타입을 전달하는 것과 참조 타입을 전달하는 것에는 동작 방식에 차이가 있습니다.원시 타입(primity type) 전달 방식 행위 : add 함수를 통해 int타입의 변..

CS/Java 2025.10.14

[Spring Security + JWT] 세션 기반 인증에서 JWT로 전환 회고

2025.01.11 15:26 작성 학교 수업 시간에 SpringSecurity를 사용해서 프로젝트를 진행했었다.처음에는 웹으로 프로젝트를 만들고자 세션으로 진행을 하였으나, 프로젝트 주제 상 모바일이 더 적합하다고 느껴 JWT로 전환해보자고 결정했다.왜 SpringSecurity를 사용했는가?Spring 공식 문서에 따르면, Spring Security는 Java 애플리케이션에서 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크라고 기술되어 있다. 그 핵심은 사용자 정의 요구 사항을 충족하도록 쉽게 확장할 수 있는 점에 있다.Spring Security의 주요 특징은 다음과 같다:인증 및 권한 부여에 대한 포괄적이고 확장 가능한 지원세션 고정, 클릭재킹, 크로스 사이트 요청 위조(CSRF) 등..

PROJECT 2025.10.14

Generic

Q. 자바의 Generic에 대해 설명해주세요.자바의 Generic은 "이 클래스나 메소드는 나중에 실제로 사용할 때 타입을 정해줄게"라고 하며 작성할 때 타입을 정하지 않는 기능입니다. 클래스나 메소드를 정의할 때 타입 파라미터를 지정하여, 실제 객체를 생성하거나 메소드를 호출할 때 구체적인 타입을 결정할 수 있게 합니다. 이를 통해 형 변환 오류를 줄이고, 컴파일 시점에 오류를 미리 발견하며, 개발자의 생산성을 향상시킬 수 있습니다. Q. Object를 사용하면 String을 포함한 모든 타입을 다 저장할 수 있을텐데, Generic을 꼭 써야하는 이유가 있나요?Object를 사용하면 어떤 타입이든 저장할 수 있지만, 꺼낼 때 항상 Object타입으로 반환되기 때문에 추가작업을 위해 명시적 형변환이..

CS/Java 2025.10.13

[MSA-초기세팅]🏗️ MSA 환경 구성 (1)

지난 글 [기획/설계] DDD 기반 설계와 EventStorming 도입하기에서도메인을 기능 단위로 나누고, 각 서비스의 역할과 경계를 정리했습니다. 이번에는 그 설계를 실제로 구현할 MSA 개발 환경을 세팅해보려 합니다.여기서 말하는 ‘환경 세팅’은 단순히 프로젝트를 여러 개로 나누는 걸 넘어,각 서비스가 독립적으로 실행되고 서로 통신하며, 배포 가능한 상태로 만드는 것을 의미합니다.📚 시리즈 구성이 시리즈는 다음 순서로 진행됩니다.MSA 환경 구성 – 각 서비스의 공통 환경과 인프라 구조 설정 (현재 글)멀티모듈 구성 – 공통 모듈, Proto 공유, Gradle 설정Spring Cloud Config (Private Repo) – 설정 중앙화 및 비공개 레포지토리 관리Eureka (Server/C..

MSA 2025.10.09

[MSA-기획/설계] DDD기반 설계 EventStorming 도입하기

작성: 2025.05.20🌈이벤트 스토밍 도입 배경MSA 기반 중고거래 플랫폼을 만들기로 하여 ERD를 구상하기로 했습니다.처음에는 무작정 서비스를 도메인 별로 나누었더니 회원 + 프로필 / Auth / 상품+관심상품+상품검색/ 거래+배송/ 알림 / 신고 + 관리자 기능 / 커뮤니티, 커뮤니티 검색 / 채팅 이렇게 9개로 구분을 했었습니다.그런데 이렇게 자잘하게 나누다보니 마이크로서비스 간의 호출이 너무 잦게되어 오버스펙으로 판단이 되었기에 이에 대해서 멘토님께 “회원을 처리할 때 인증 인가 부분을 Auth 서비스에서 책임지게 하고, Memeber 서비스에서는 회원 등록, 수정, 탈퇴 등 프로필 관리만 할 수 있도록 나누는 것이 괜찮을까요?” 라고 질문을 드렸었고, 이에 대한 답은 “너무 오버스펙인 것..

MSA 2025.10.09