전체 글 썸네일형 리스트형 스프링 db 접근 기술 선택에 대한 고민? 스프링 에서 db 에 접근하는 기술은 참 많다.대표적으로 JdbcTemplate, MyBatis, JPA, 스프링 데이터 JPA, Querydsl .. 1) JdbcTemplate 이나 MyBatis 같은 기술들은 SQL 을 직접 작성해야 하는 단점은 있지만 기술이 단순해서새로운 개발자가 와도 금방 적응 가능2) JPA 같은 기술은 깔끔하고 개발생산성을 높여주지만 러닝 커브가 꽤 있음. 그리고 매우 복잡한 통계 쿼리를 주로 작성하는 경우에는 잘 맞지 않음 >> 그런데 대부분의 SI 대기업 (프로젝트마다 다르겠지만) 은 복잡한 통계 쿼리가 많지 않을까? erp 시스템은 여러 개 조인해서 통계 내는 경우가 많으니까. 어떤 걸 선택할 때 하나의 정답이 있다기 보단 프로젝트 구성원의 역량 / 비즈니스 요구사항에.. 더보기 좋은 설계란? 제약이 있는 것 + 의도가 드러나는 것 제약이 있다는 건 무슨 말이냐 하면..예시를 하나 들자면,스프링 AOP 에서 어드바이스에 적용할 수 있는 여러 어노테이션이 있다. @Around @Before@After@AfterReturning@AfterThrowing.. 여기서 가장 강력한건 @Around 이다.실제 타겟 메소드가 실행되기 전/후를 다 컨트롤 가능하기 때문이다. 그럼 왜 굳이 @Before, @After 같은 어노테이션이 존재할까?가장 강력한 @Around 를 쓰면 뭔들 컨트롤 가능한데? 이유는 개발자의 실수를 막기 위해서다..실수를 막기 위해서 제약이 있는 어노테이션을 쓰는 것이다. @Around 는 기능이 막강한 대신,jointPoint.proceed() 를 명시적으로 선언하지 않으면 타겟 메소드가 실행되지 않는다.-> 즉, 개발.. 더보기 뭐가 안 풀릴 때는.. 뭐가 안 풀릴 때는 왜 안 풀리지? 내가 놓친 부분이 뭐지? 이걸 찾는 것도 좋지만그냥 간소화된 샘플 코드 만들어서 (Cursor 로 뚝딱이니까 이 부분은 귀찮을 필요도 없음)내가 테스트 하려는 API 를 똑같이 호출해보는게 오류 원인 찾는데 더 빠를 수도 있음 더보기 리팩토링 시 주의할 점 기존 코드의 구조를 바꿔야할 때, 리팩토링할 때 주의할 점한 번에 다 바꿔버리려고 하면 안 된다. 무조건 같은 레벨 단위로 점진적으로 바꿔야함.구조적인 큰 거를 개선할 때 + 디테일한 것을 개선할 때 => 이 2개는 레벨이 다름이렇게 레벨이 다른 상황을 개선할 때는 같은 레벨끼리만 우선 개선해야함구조를 개선할 때는 구조만 개선하고 기존 코드는 최대한 유지시켜야함..한 번에 다 해버리면 코드 짬뽕되고 리팩토링 도중 오류 나면 어디가 문제인 지 디버깅 하기도 힘듬전체적인 구조 개선한 후에 문제가 없는 걸 확인 -> 그 다음 기존 세밀한 코드를 바꾸면 됨 API 개발 시 좋은 기준 엔티티 Item 이라는 클래스를 재사용 하는 것보다,ItemDto 를 만들어서 제한을 두는게 좋다. (id 필드 없는 price,.. 더보기 구독 테이블 설계 관련 - 사용자 구독 플랜 정보 조회 방식 개선 사용자 구독 플랜 정보 조회 방식 개선기존에는 구독 플랜 정보를 조회하려면 subscription -> subscriptionPrice -> subscriptionPlan 테이블을 순차적으로 조인해서 planType 컬럼의 정보를 알아내야 했다. 이는 내가 설계한 구조이기 때문에, 처음 이 구조를 접하는 다른 개발자 입장에서는사용자의 구독 플랜을 알고 싶을 때 어느 테이블을 조회해야할 지 바로 파악하기 어렵다는 문제가 있다.(ex. 이 사람이 Basic 플랜 유저인 지 알려면 어느 테이블을 뒤져야하죠?! 라고 나에게 매번 물어봐야 한다.) 이러한 문제를 해결하기 위해, 팀원들과 상의한 결과user 테이블에 planType 컬럼을 추가하여사용자가 구독 중인 플랜이 Free, Basic, Premium 중.. 더보기 구독 테이블 설계하기 요즘 구독 테이블 설계를 하고 있다.이미 만들어져있는 구독 서비스를 유지보수 해본 적은 있지만 구독 테이블을 직접 설계하는건 처음이다.고민했던 2가지 주제를 공유하고자 한다. 주제 1) 구독 테이블 설계 - 한 줄로 관리할 것인가, 매 월 새로운 행을 추가할 것인가?구독 테이블 관리 방식에 관한 얘기이다. (1) 한 개의 row 를 유지하며 갱신하는 방식- 유저가 특정 플랜을 구독하면 subscription 테이블에 한 개의 row 가 INSERT 됨- 매달 결제가 이루어질 때 currentPeriodStart, currentPeriodEnd 를 업데이트하여 현재 구독 기간을 관리- 결제 내역 테이블 (paymentHistory) 을 subscription 과 1:N 관계로 두어, 매달 결제가 이루어질.. 더보기 검색 기능 구현을 위해 mysql full text search 이용하기 검색 기능 구현을 위해 mysql full text search 를 이용하는 과정에서내가 왜 ngram parser 를 선택했는 지 그 근거를 정리하고자 한다. 1. parser 종류mysql full text search 에서는 대표적으로 built-in mysql parser 와 ngram parser 를 제공한다.공식 문서에는 다음과 같이 말하고 있다.- mysql 에서 기본적으로 제공하는 built-in parser 는 공백을 통해 단어의 시작과 끝을 결정함ex) "hello world" -> hello 와 world 를 각각 단어로 인지 - 그러나 한국어는 공백으로 단어의 시작과 끝을 판단할 수 없어서 built-in parser 를 이용하는게 의미가 없음- 이를 해결하기 위해 ngram pa.. 더보기 API 설계 고민: 휴지통 검색 기능 1. 개요내가 했던 고민을 말하기 전에 개발 중인 앱의 컨셉을 먼저 설명하겠다.이 앱에는 휴지통 개념이 존재하고 이 휴지통에는 [폴더] 와 [파일] 이 존재할 수 있다.우리 앱 화면을 캡쳐할 수는 없어서 비슷한 구조인 구글 드라이브 캡쳐를 참고용으로 가져와봤다. 휴지통에 있는 파일이든 폴더든 더블 클릭하는 순간 "복원 하시겠습니까?" 알럿이 뜬다. 현재 우리 앱의 휴지통이 동작하는 방식도 구글 드라이브와 비슷하게 아래와 같다. 1. 폴더 구조- a > b > c 형태의 중첩된(Nested) 폴더 구조를 가짐. 2. 폴더 삭제- 상위 폴더 a가 삭제되면 b와 c를 포함한 모든 하위 폴더가 함께 휴지통으로 이동. 3. 복원 동작- a 폴더를 복원하면, 포함된 모든 하위 폴더(b, c)가 함께 복원됨.- .. 더보기 이전 1 2 3 4 5 다음