본문 바로가기

전체 글382

동시성과 정합성을 어떻게 관리할 수 있을까? 이전에 동시성에 대한 내용을 다룬적 있다. https://devkingdom.tistory.com/303 동시성 프로그래밍에 대하여 백엔드 개발자라면 동시성을 고려한 프로그래밍을 할 줄 알아야한다. 다만 아직 학생이거나 주니어 레벨에서는 이러한 동시성을 이해하기가 쉽지는 않다. 프론트 단의 개발과는 다르게 백엔드 devkingdom.tistory.com 관련한 내용을 옛자료를 보고 정리를 해놔서... 요즘 대체적으로 많이 쓴느 개발 환경인 Spring JPA 에서는 어떻게 적용하면 될지를 정리해야겠다는 생각을 했었다. 우선 상황을 가정해보자. 상품 구매 시스템을 만든다고 가정하고, 인기 있는 상품을 조회하는 기능을 개발한다고 가정하자. 상품 구매 -> 이미 구매된 동일 상품이 있는지 조회 -> 상품 정보.. 2023. 3. 19.
코드리뷰 이야기 코드리뷰에 대해 부정적인 사람들이 생각보다 많다. 5년전 신입으로 입사한 회사에서 처음으로 코드리뷰를 접한 적 있다. 상사의 지시로 진행하게 된 코드리뷰의 결말은 최악에 가까웠다. 같이 입사한 동기 둘과 했던 코드리뷰는 코드의 퀄리티를 높이기는 커녕 개발 시간을 딜레이 시켰고, 서로의 감정을 건드리는 일이 생겼다. 결국 코드리뷰는 시작한지 몇개월 만에 없어졌고 프로젝트 또한 예정된 시간에 끝마쳐지지 못했다. 왜 이러한 일이 발생했을까? 모든 개발자들이 코드리뷰를 아주 중요하다고 생각하지만 그 과정 자체를 무조건 긍정적인 것이라 생각하지 않는다. 먼저 코드 리뷰 자체가 시간과 노력을 쏟아부어야하는 일이기 때문이다. 정상적인 코드리뷰를 진행하기 위해서는 개발자들이 꽤 많은 시간을 투자해야한다. 만약 한참 바.. 2023. 2. 23.
io.jsonwebtoken.lang.UnknownClassException 서비스의 회원 로그인 기능을 개발하면서 jwt 를 이용한 토큰발행하는 부분을 구현하다가 아래의 런타임 에러를 받았다. 이 문제는 별도로 의존성을 두가지 추가해주면 해결된다. implementation("io.jsonwebtoken:jjwt-api:0.11.5") // 기존 runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") // 추가 runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") // 추가 2023. 2. 22.
스프링 빈 순환 참조 (The dependencies of some of the beans in the application context form a cycle) 해결법 어딘가 면접을 가보면 간혹 듣는 질문이 있다. 왜 생성자 주입을하는가? 그 이유중 하나가 빈의 순환 참조를 방지하기 위함인데, 스프링 빈 순환 참조는 어플리케이션 컨텍스트에서 일부 빈의 종속성이 순환주기를 만들어서 생기는 문제이다. 즉, 둘 이상의 빈이 생성자를 통해 서로 주입할 때 발생한다. 일반적으로 스프링은 어플리케이션 컨텍스트의 시작 되즌 과정에서 모든 싱긅톤 빈을 즉시 생성하는데, 이렇게 하는 이유가 컴파일단계에서 에러를 잡기 위해서이다. 지금 내가 알려드리는 방법은 이렇게 생성되는 빈을 프록시 객체로 생성하고 추후에 지연로딩으로 생성되도록하는 임시방편의 방법이다. @Lazy 어노테이션을 통해서 지연로딩을 시켜주면 어플리케이션이 실행될때 즉시 객체가 초기화되는 것이아니라 프록시 객체를 주입해 사.. 2023. 2. 22.
JdbcSQLNonTransientConnectionException: Exception opening port "xxxx" (port may be in use), cause: "java.net.BindException: Address already in use" [90061-214] 해결 웹 어플리케이션을 로컬에서 개발하다보면 같은 포트를 실수로 사용하게 되는 경우가 있다. 같은 포트를 동시에 사용하면 위와 같은 에러 메시지를 볼 때가 있으실 것이다. 이 문제를 해결하는 방법은 간단하다. 이미 쓰고 있는 프로세스를 죽여버리면된다. ( 라이브환경에서는 쓰고 있는 프로세스를 과감하게 지우는 일은 아주 크레이지한 일이니 주의하자..) 다양한 방법이 있겠지만 아래 방법을 리눅스 콘솔 환경에서 쳐주면 된다. 일단 어떤프로세스가 해당 포트를 점유하고 있는지를 보자. lsof -i:[port] PID 가 7370 인 프로세스가 떠있는걸 볼 수 있다. 이제 죽이자. kill -9 [PID] 이렇게 해주면 깔끔하게 프로세스가 죽는다. (다시 한번 말하지만... 라이브 환경에서 이 명령어를 함부로 수행하면.. 2023. 2. 20.
개발 방법론 - 페어 프로그래밍 기존에 대기업을 다니다가 스타트업으로 이직을 했다. 개발 문화나 제품을 만들어 내는 프로세스 등 모든 것이 기존과 달랐다. 스타트업이라 배울 점도 많았고 부족한 점도 많았다. 그 중에서도 내가 재직 중인 스타트업 팀에서 사용하는 개발 방법론을 소개해보도록 하겠다. 페어 프로그래밍 나는 현재 현 회사의 백엔드 개발 업무를 맡고 있다. 프로젝트를 할때 코틀린 기반으로 진행하기로 모든 팀원들과 협의를 했는데, 나는 자바나 C# 의 경험만 있어서 과연 내가 잘 할 수 있을까하는 고민이 많았다. 그러다 빠르게 구현해야할 서비스 하나가 있었는데 혼자 진행하기에는 무리다는 판단을 했고, 약 2년정도 연차가 높으신 옆에 계신 동료에게 도움을 요청했다. 그 분께서는 본인이 조금 여유가 있으니 이번에 진행할 프로젝트는 페.. 2023. 2. 18.
RESTFul API 설계 팁 - Consumer first 개발하거나 설계하는 사람의 시각에서가 아닌 실제 사용하는 사용자 입장에서 직관적이고 명료하게 설계해야 한다. 소비자는 엔드 유저인 실제 고객이 아니라 이 api를 이용하는 사람이 될 것이다. - Make best use of HTTP http의 메서드와 request, response 의 타입, 헤더값 등을 이용하는 등 http의 장점을 모두 사용해서 설계할 필요가 있다. - Request methods 최소한 메서드의 4 종류는 구분하여 설계하라 . GET, POST, PUT, DELETE 를 이용하여 crud 를 구분하여 설계하자 - Response Status 각각의 api 요청에 따른 응답 코드가 전송되어야 한다 (200, 404, 400, 201, 401 등..) .. 2023. 2. 15.
Microservice 12 Factors + 3 Factors 1. base code - 각 레퍼지토리에 저장된 마이크로서비스 단일 코드 베이스를 뜻함. - 버전 제어를 위한 목적, 형상관리를 위해 코드를 한곳에서 배포하는 것이 목적. - 이후 테스트 환경이나 라이브 환경 등에 배포하기 위해서는 통일된 코드 관리가 필요함 2. dependency isolation - 각 마이크로 서비스는 자체 종속성을 가지고 패키징되어 있는 구조 - 전체 시스템에 영향을 주지 않는 상태에서 변경되어야 함 3. configurations - 코드 내에 하드 코딩되어 있는 구성 설정 정보가 없어야함 - 위부에서 마이크로서비스의 설정에 필요한 작업들을 할 수 있어야함 - 동일한 구성정보가 외부 서비스 정보에 전파될 수가 있음 4. linkable backing services - 서비스.. 2023. 2. 15.
[Effective Java] 제네릭(Generic) 활용하기 (1) 오늘은 제네릭에 대해 정리해두려 한다. 제네릭 용어 정리 한글 용어 영문 용어 예 매개변수화 타입 parameterized type List 실제 타입 매개변수 actual type parameter String 제네릭 타입 generic type List 정규 타입 매개변수 formal type parameter E 비한정적 와일드카드 타입 unbounded wildcard type List 로 타입 raw type List 한정적 타입 매개변수 bounded type parameter 재귀적 타입 한정 recursive type bound 한정적 와일드카드 타입 bounded wildcard type List s2 = (Set) s1; for(Object o : s2) { if(o instancof .. 2023. 2. 10.