반응형

전체 글 470

클린 아키텍처 를 읽고 SOLID 에 대한 생각과 나의 반성 시간

지금 2019년 12월부터 이 글을 쓰고 있는 지금까지도 야근과 코드, DB 리펙토링을 하느라 책을 잘 보지 못했다. 그래서 책을 읽으려 노력하고 있으며 [클린 아키텍처] 를 읽고 든 생각을 정리해보려고 한다. 물론 책마다 다를 수 있기 때문에 다른 책도 읽어보긴 해야 할 것 같다. SOLID: 변경에 유연하고, 유지보수를 쉽게 만들고자 할 때 시스템에 적용 가능한 원칙 먼저 해당 책에서는 SOLID 에 대해서 얘기 하는 목차가 있다. SRP(단일 책임 원칙: Single Responsibility Principle) 먼저 SRP 부터 소개하는데 내가 평소에 생각하고 있던 것과 다르게 얘기를 한다. 내가 생각하던 SRP 는 "하나의 기능, 메소드는 한 가지의 책임만을 가져야 한다." 였고 책에서는 이게 ..

etc/책 리뷰 2021.05.15

[Spring] 최대 사용 기기 관리 구현

앱에서 최대 3개의 기기에서 로그인을 하여 서비스를 이용할 수 있도록 해달라는 요구사항이 생겼을 때 어떻게 구현을 하면 좋을까 해서 검색을 좀 해보았는데 나오는 글이 없었다. 내가 못 찾은 걸지도 ㅎㅎ 자세한 요구사항은 작성하지 않지만 간략하게 이야기하면 다음과 같다. 요구사항 서로 다른 기기라는 것을 구분해야 함 웹, 앱 내에 마이페이지에서 등록된 기기를 개별 삭제, 전체 삭제를 할 수 있어야 함 기기 별로 기기 이름과 마지막 접속 시간이 나타나야 함 이미 3대의 기기가 등록 돼 있는 상태에서 추가로 기기가 등록된다면 해당 기기에서는 사용자에게 등록된 기기를 삭제하고 로그인을 할 수 있거나 로그인을 하지 않고 앱을 나갈 수 있음. 그렇다면 요청이 들어올 때마다 서버에서는 요청을 어느 기기에서 요청한 것..

개발/Spring 2021.04.17

[Ktor] Ktor 서버에서 LocalDateTime 을 json 으로 반환하기

Ktor 공식문서를 참고해서 ContentNegotiation 를 install 에서 repsonse 에 객체를 담아 json 으로 내보내려고 할 때를 위해 사용하려고 했다. Ktor 에서 지원해주는 Gson, Jackson, kotlinx.serializaiton 을 이용해서 굳이 직접 converter 를 설정해주지 않도록 하려고 했다. 그래서 그 중 평소에 사용하는 Jackson 을 사용하는 것으로 했고, 간단하게 저런 식으로 LocalDateTime 으로 반환하려고 했으나 map 형태로 반환이 돼 추가적으로 conveter 를 구현하여 jackson objectMapper 에 모듈로 추가를 해줘야 했다. jackson-datatype-jsr310 해당 의존성 추가해서 작업하려고 했는데 의존성 또 ..

개발/ktor 2021.04.03

[Ktor] Ktor 서버 생성

사이드프로젝트를 개발 중에 있는데 프론트 개발을 하다보니 지겹기도 하고 얼추 기능단은 완성이 돼 가고 있어서 서버 개발을 시작해보려고 했다. 인텔리제이에서 프로젝트 생성을 하려는 순간,, 또 Spring 을 써야하나,,? 이 빌드 시간도 느리고 내가 몇 년간 회사에서 사용했던 프레임워크를,, ? 또..? 라는 생각이 들었다. 그래서 여러 프레임워크나 라이브러리 중 node 기반의 nest 와 ktor 사이에서 고민이 됐다. nest 는 ts 기반으로 개발을 할 생각이었는데 생각해보니 회사의 한 개발자분께서 스크립트 기반으로 서버 개발하려니 너무 힘들다,, 라는 말씀을 했던 것이 기억나 주변에서 한 번도 얘기 들어보지 못 했던 ktor 를 고르게 됐다 ㅎㅎ ktor.io 에 접속하면 해당 문구가 있다. 내..

개발/ktor 2021.04.03

[Spring] 사용자의 데이터 변경 이력 관리

개발을 하다가 문득 사용자의 추천 설정과 같은 정보들의 변경 이력을 관리하고 있지 않고 있었다라는 것을 깨달았다. 예상되는 문제는 사용자에게 추천을 했는데 로직 상 문제 없는 추천에 대해서 사용자가 착각해서 이거 왜 추천되나요? 라고 했을 때이다. 이 유저가 추천 설정이 C 라고 돼 있을 때, 신고 당시 A 였는지 B 였는지 계속 C인 상태였는지 파악이 되지 않아 파악에 굉장히 어려울 것 같았다. 처음에는 아래와 같은 테이블로 작업을 할까 했었다. 왜냐하면 제일 간단하다고 생각했고, 해당 테이블 하나로 여러 데이터의 변경 이력을 관리할 수 있으니까 관리 포인트도 줄일 수 있을 것 같았다. id user_id target before create_date pk 변경 필드 변경 전 데이터 그러나 http p..

개발/Spring 2021.01.13

[Spring] 코틀린 data class 사용 시 retrofit 에서 @JsonProperty 가 적용되지 않을 때

사용하고 있는 retrofit 의 버전은 각각 다음과 같다. - retrofit 2.3.0 - converter-jackson 2.3.0 분명 JacksonConverterFactory 를 추가해주었는데도 적용이 안됐다. kotlin data class 에서 @JsonProperty 가 적용되기 위해 해당 의존성을 추가해서 사용하고 있었다. 그리고, retrofit 문서에서 나와있는 대로 converter 를 추가하기 위해 다음과 같은 의존성을 또 추가 해 주었다. 여기서 나는 retrofit 에서 제공하는 jackson-converter 에는 기본적으로 kotlin 을 위한 설정이 돼 있지 않다고 생각이 들었다. 그래서 retrofit 의 jackson converter 에서만 KoltinModule ..

개발/Spring 2020.12.27

select 에도 transaction 걸어야 하는 이유

예전에 막 개발을 시작했을 때 spring 에서 @Tramsactional 이라는 어노테이션을 단순 select 에서도 적용하는 것을 보고 궁금했었다. 이번에 Real Mysql 책을 보다가 비슷한? 내용이 나왔다. 트랜잭션 내에서 실행되는 SELECT 문장과 트랜잭션 없이 실행되는 SELECT 문장의 차이는 READ COMMITTED 격리 수준에서는 차이가 별로 없다. 그러나 REPEATABLE READ 격리 수준에서는 트랜잭션 동안에 다른 트랜잭션에서 아무리 특정 데이터를 변경하고 커밋하더라도 동일한 결과를 보게 된다. 그렇기 때문에 격리 수준에 따라서 동작이 달라진다. 위의 현상을 non-repeatable read 라고 한다. read committed 일 때는 특정 트랜잭션 내에서 A 데이터를 ..

인덱스의 중요성을 다시 한 번 느끼며..

몇 달 전 메인 기능이 배포되고, 실서비스에서 동작이 잘 되고 있어서 신경 쓰지 않고 다른 피처를 개발하고 있었다. 그 기능을 얘기하면 사용자의 로그를 쌓아서 그 로그를 기반으로 어떤 추천을 해주는 그런 기능이었다. 그 로그가 이제 유저당 몇 만개씩 쌓이게 되었고, 클라이언트에서 해당 기능에 대한 api 를 요청하게 될 때 timeout 이 발생하는 경우가 생겼다. 확인해보니 코드 상에서는 문제가 전혀 없었고 단순 select 하는 쿼리에서 이 쿼리가 이렇게 느리다고? 할 정도였다. 그리고 확인해보니 특정 컬럼에 인덱스가 걸려있지 않았었다. 흑흑. 테이블 만들 때 잊고 만들었었던 것 같다. 긍정적으로 생각하면, 평소에 인덱스 공부할 때 중요하다 중요하다 할 때는 그냥 중요하다~ 라고 생각이 들었는데 실제..

CS/Data Base 2020.12.16

[Spring Batch] no job configuration with the name was registered

'sync' 라는 job 을 생성하고 jobLocator 를 이용하여 job 을 가져오려고 하는데 계속 해당 에러가 발생했다. no job configuration with the name 'sync' was registered 우선 Spring Batch 에서 JobRegistry 라는 클래스를 제공해주고 있다. 해당 JobRegistryBeanPostProcessor 클래스도 제공하는데 job 들을 설정한 jobRegistry 에 등록시켜주는 친구인 것 같다. 네이밍도 Post Processor 인 것으로 보아 application context 올라가고 job 으로 등록된 bean 들을 jobRegistry 에 등록시켜 주는 것으로 이해하면 될 것 같다. @Configuration class Job..

개발/Spring 2020.12.01

좋지 않은 테이블 구조에서의 개발

좋지 않은 테이블 구조에서의 개발을 어떻게 해야할까..? 좋지 않은 테이블 구조라고 했는데 우선 정합성이 다 깨져버려있다는 것을 의미하고 있다. 그리고 특정 A, B 테이블의 의존관계가 1 : N 이 될 수도 있고, 1 : 1 이 될 수도 있다. 백엔드에선 JPA, querydsl 을 사용해서 의존관계 맺어서 one to one, one to many 등을 이용해서 각 기능들을 구현하고 있었다. 그런데 테이블 구조가 썩 좋진 않다보니 쉽게 개발하려고 JPA 를 사용하는데 비즈니스 코드가 너무 복잡해지거나, 테이블 구조가 이상한데 이걸 다시 코드로 구현하자니 코드도 썩 좋지 않게 되는 것 같았다. 그래서 우선 각 엔티티 별로 모두 다 쪼개고 의존관계 맺지 않고 무조건 코드에서 각 엔티티를 조합해서 사용하는..

반응형