전체 글 (54) [260722] Redis 인메모리 저장소와 캐싱 학습 오늘 한 일오늘은 인메모리 저장소와 캐싱 전략 강의를 들으며 핵심 개념을 정리했다. Redis를 단순히 빠른 저장소로만 생각했는데, 용도에 맞는 자료형과 명령을 선택하는 것이 설계의 핵심이라는 점을 알게 됐다.정리인메모리와 Redis의 역할RDB는 데이터의 영속성과 정합성을 보장하는 데 적합하지만, 변경이 잦은 임시 데이터를 매번 처리하면 부하가 커질 수 있다.Redis는 메모리 기반 Key-Value NoSQL로 세션, 캐시, 리더보드, 조회수 등을 관리하는 데 적합하다.메모리는 빠르지만 데이터가 유실될 수 있다. 따라서 Redis에 저장할 데이터와 장애 발생 시 복구 방법을 함께 설계해야 한다.Redis 자료형과 용도타입핵심 명령어용도StringSET/GET, INCR/DECR, MSET/MGET단순.. [260720] 프로젝트 발표와 회고 오늘 한 일오늘은 프로젝트 과정을 마무리하는 날이었다. 프로젝트 발표를 진행했고, 회고와 다면평가까지 이어서 하면서 그동안 쌓아 온 일을 글로 정리했다. 발표는 성공적으로 마쳤다. 준비할 때는 손이 많이 갔지만 구현 고민, 성능과 설계 선택 등 해 왔던 부분들이 발표 안에서 잘 드러난 것 같아 만족스러웠다. "우리가 뭘 했고, 고민하고 개선했는지"가 전달된 마무리였다고 생각한다. 회고와 다면평가 문구를 다듬는 데도 시간을 썼다. 팀 소통에 대해서는 팀원 분들의 성향을 보면서 의견 조율 방식을 고민했던 점을 다시 짚었다. 작은 질문은 슬랙으로 빠르게 처리하고, 꼭 맞춰야 하는 부분만 회의로 가져갔다. 덕분에 큰 마찰 없이 개발에 집중할 수 있었던 것 같다. 조금 더 깊이 토론하고 소통했으면 좋았겠다는 아쉬.. [260710] PATCH 의 null 처리, 동시성 처리 방법 고려 오늘 한 일음식점 삭제 API 구현OWNER는 본인 음식점만, MANAGER와 MASTER는 전체 음식점을 삭제할 수 있도록 구현음식점 도메인 단위 테스트를 역할에 따라 나눠서 작성개발하면서 배운 점PATCH에서는 null과 빈 문자열의 뜻이 다르다음식점 수정 요청에서 null은 해당 값을 바꾸지 않겠다는 뜻이다. 그래서 모든 필드가 null인 요청도 허용할 수 있다. 반면 이름이나 주소가 전달됐다면 공백이어서는 안 되고, 설명은 빈 문자열을 보내 기존 내용을 지울 수 있다.좌표, 배달 반경, 최소 주문 금액처럼 범위가 정해진 값은 정상 값 하나만 테스트해서는 부족하다. 최솟값과 최댓값은 통과하는지, 범위를 조금이라도 벗어나거나 허용 자릿수를 넘으면 실패하는지 함께 확인해야 한다. 비슷한 입력값은 @Pa.. [260708] API 구현 오늘 한 일OWNER 음식점 조회 API 구현음식점 정보 수정 API 구현음식점 삭제 API 구현코드 변경에서 배운 점내 음식점 조회는 소유자 조건과 soft delete 조건을 같이 봐야 한다OWNER 음식점 조회는 단순히 음식점 전체 목록에서 필터링하는 기능이 아니라, 로그인한 사용자가 소유한 활성 음식점만 반환해야 하는 기능이다.그래서 Repository에는 findByUser_IdAndDeletedAtIsNull처럼 소유자 ID와 삭제 여부를 동시에 조건으로 거는 메서드가 필요했다.soft delete를 사용하는 도메인에서는 조회 메서드 이름을 만들 때부터 DeletedAtIsNull을 습관처럼 붙일지 검토해야 한다. 삭제된 데이터가 조회되면 사용자는 이미 제거된 리소스를 다시 수정하거나 주문에 .. [260708] 프로젝트 진행 및 코드리뷰 오늘 한 일음식점 등록 API를 구현하고 PR을 머지했다.OWNER 사용자가 음식점을 등록할 수 있다.POST /api/restaurantsJWT 인증 사용자 ID를 기반으로 음식점 소유자를 설정DB에서 사용자 정보를 다시 조회해 OWNER 권한 확인음식점 카테고리 조회 및 예외 처리코드 변경에서 배운 점JWT의 role만 믿지 않고 DB 기준으로 권한을 다시 확인하기JWT에 들어있는 role은 토큰 발급 시점의 정보다. 사용자의 권한이 이후에 변경될 수 있으므로, 음식점 등록처럼 권한이 중요한 기능에서는 서비스 계층에서 DB의 현재 사용자 상태를 다시 확인하는 편이 더 안전하다.이번 음식점 등록 API에서는 컨트롤러에서 인증 사용자 ID를 받고, 서비스에서 사용자 조회와 OWNER 권한 검증을 수행하도.. [260703] 팀 프로젝트 초기 설계 오늘 배운 것프로젝트 초기 설계 단계에서 DB의 식별자, API 응답 형식, Git 협업 전략을 먼저 정하면서 개발 과정에서 발생하는 사이드이펙트를 최소화하는 것을 목표로 진행했다.유저 식별자는 외부 정책이나 사용자 변경 가능성에 영향을 받지 않는 내부의 고정값으로 관리하는 것이 중요하다.유저 식별자유저의 PK는 username이 아닌 userId로 설정한다.userId 타입은 UUID를 사용한다.username에는 UNIQUE 제약조건을 적용한다.username은 FK 참조 대상이나 내부 PK로 사용하지 않는다.username은 닉네임 변경, 정책 변경, 탈퇴 후 재가입, 외부 노출 등 문제 발생 시 사이드이펙트가 커질 수 있다. 또한 문자열 타입은 UUID에 비해 비용이 높다.Git 전략 및 코드리뷰.. [260702] Git, 도메인 기능 정의 오늘 Git 특강에서 배운 것git의 기본 개념과 활용 방법PR, 코드리뷰, git flow 전략CI/CD 개념&실습팀 협업을 위한 특강이었다. 특강에서 배운 것을 활용해서 작업하면 문제는 없을 듯 하다!팀 프로젝트 시작팀장을 원하는 분이 없어 사다리 타기로 팀장을 정했는데 내가 맡게 되었다. 이런 역할이 익숙하지 않아서 그런지 부담도 되고 걱정이 앞서는 것 같다. 갑자기 맡게 된 자리라 회의 진행이 매끄럽게 못했고 중간중간 버벅였는데, 나의 또 다른 부족함을 깨달은 순간이었다. 그래도 팀에 도움이 될 수 있도록 책임감을 가지고 노력해볼 생각이다.도메인 기능 정의요구사항에 맞춰 도메인을 정하고 기능을 정의했다. 생각보다 신경써야 될 부분들이 많았고, 살펴볼수록 추가하고 싶은 기능들이 많이 보였다. 우선은.. [260701] 07. MyBatis와 JPA MyBatis와 JPAMyBatisMyBatis는 쿼리 중심이다.Java 코드와 매칭되는 SQL을 작성해둔 XML 파일과 연결하여 DB를 호출한다.JPAJPA는 객체 중심이다.Java 코드상에 Entity를 정의하고 DB의 테이블과 연결한다.개발자는 SQL보다 Java 코드의 객체를 통해 저장하고 조회하는 방식으로 DB와 통신한다.@Entity , @Table(name = "users") , @Id 등 어노테이션을 활용한다.관계 매핑@OneToOne1:1 관계진짜 테이블을 나눌 이유가 있을 때만 씀@OneToMany1:N 관계하나의 User가 여러 Post를 가질 수 있습니다.@ManyToOneN:1 관계여러 Comment가 하나의 Thread에 속합니다.@ManyToManyN:M 관계JPA가 중간 테이.. 이전 1 2 3 4 ··· 7 다음