목록전체 글 (128)
지나공 : 지식을 나누는 공간
올해 들어 헥사고날 아키텍처 책을 읽었는데 이걸 실무에 당장 도입하기는 쉽지 않다고 생각했다. 패키지 이름도 낯설고 은근 러닝커브(?)가 좀 있는 거 같다. 그래서 이걸 당장 도입하자는 욕심은 잠시 내려놨고, 대신 헥사고날 아키텍처에서 지향하는 것, package-private을 통해 강제하고자 하는 것이 무엇인지 떠올렸다. 최근 팀원 분과 페어프로그래밍을 진행하면서 대부분에게 익숙한 레이어드 아키텍처 안에서도 헥사고날 아키텍처의 지향점을 잘 녹여내자는 목표를 가졌다. 나는 헥사고날을 [만들면서 배우는 클린 아키텍처, 위키북스] 책으로 접했는데, 결국 내내 반복적으로 말하는 지향점은 객체 지향 설계, 즉 SOLID 원칙이었다. 최근에 우리 팀에서 매년 반복적으로 준비하는 행사의 코드가 여기저기 산재되어 ..
들어가는 말 최근 회사에서 solid 원칙을 적용하여 리팩터링을 진행했다. 워낙 의존성이 꼬여 있어서 무언가 로직을 바꾸기 보다는 최대한 기존의 로직을 유지하면서 진행해야 했다. 그래서 기존 로직을 유지한다는 요구사항을 만족하지만 더 적합한 기술(?)로 바꾸는 작업만 했는데 그 과정에서 직면한 문제가 있었다. 일단 문제에 들어가기 앞서 스프링 빈 콜백에 대해 훑어보고 들어가자. 스프링 빈 콜백 리마인드 스프링 빈으로 등록되는 클래스 안에서 어떤 멤버변수가 딱 한번만 초기화되게 하려면 어떻게 해야할까? 일단 스프링 빈은 기본적으로 싱글톤이기 때문에 딱 한번만 초기화해놓고 계속 그때 초기화된 그대로 멤버변수를 반환하는 것이 가능하다. 기존 로직은 아래처럼 매번 그 멤버변수의 size를 확인하여 원하는 값으로..
개요 2023년의 반절이 지나가고 있다. 어느덧 입사한지 1년반이 되었고, 나도 2년차가 됐다. 2년차라고 말할 수 있는 객관적인 실력에 도달했을지는 모르겠는데 일단 작년보다는 무조건 발전한 것 같다. 업무 작년에는 작은 업무들을 위주로 하고 FE와 BE를 동일한 비율로 했는데 올해는 BE에 집중하고 있다. 올해 초 조직개편이 이뤄지면서 다른 팀이었던 분들과 한 팀이 되었고 그 팀의 팀장님으로 팀장님도 바뀌었다. 이전 팀이 너무 좋았어서 팀원과 팀장님이 바뀌는게 많이 걱정됐는데, 작년도 좋았고 올해는 올해대로 좋다. 특히 합쳐진 다른 파트의 협업 문화가 좋아서 우리 파트도 긍정적인 영향을 많이 받았다. 덕분에 나도 2023년 상반기가 뜻깊게 채워지고 있다. 무엇보다 일이 재밌어졌다. 팀원 분들께 배울 수..
현재까지 1,2 편을 적고 3을 적게 됐다. 이렇게 보니 엄청 길게 느껴졌던 내용들이 생각보다 짧은 것 같기도..? 하다. 빈 생명주기 콜백과 빈 스코프가 남았다. 바로 시작! 스프링 프로그램이 시작하기 전과 후에 무언가 부가적인 작업을 해줘야 할 때가 있다. 예를 들면 데이터베이스 커넥션 풀이나 네트워크 소켓 등이 있다. 애플리케이션이 시작될 시점에 미리 필요한 연결을 해둬야 하고, 종료될 쯤에는 연결됐던 걸 다시 해제하는 작업이 필요하다. 이러한 부가 작업들은 주요 프로그램이 실행되기 전과 후에 각각 이루어져야 한다. 이번 시간에는 네트워크 소켓을 담당하는 NetworkClient라는 객체를 만들어서 테스트한다. 네트워크 소켓을 담당하는 빈이기 때문에 이 빈의 로직이 실행되기 전에 네트워크 연결이 세..
개요 지난 시간에는 Spring이 객체지향원칙을 지켜주는 방법의 도입부. 즉 그냥 단순하게 개발하면 어디서 SOLID 원칙이 여겨지는지 알아보고 스프링 컨테이너를 사용하면 그걸 어떻게 해결해주는지를 알아봤다. 그중에서도 ApplicationContext(스프링컨테이너)를 활용해서 싱글톤 빈을 관리하는 것까지 봤는데, 이번에는 그 활용 자체를 좀 더 편하게 하도록 스프링이 뭘 제공해주는지 보고 그 외 여러가지 스프링 기능들도 볼 예정이다. 영한님 강의 중 핵심원리 기본편의 마무리 글이다. 얼른 끝내고 MVC로 가자! 아래 포스팅에 이어지는 내용이다. https://eocoding.tistory.com/120 Spring 핵심 원리 기본편 Spring 핵심 원리를 오고가면서 쓰윽 들었다. 그래서 그간의 테스..
Spring 핵심 원리를 오고가면서 쓰윽 들었다. 그래서 그간의 테스트 코드들을 살펴보면서 아주 퀵하게 정리해보려 한다. 이미 너무나 유명한 영한님 강의!ㅎㅎ 좀 오글거리는 소제목들이 있지만 난 이렇게 써야 이해가 잘 가서 부끄러워도 그냥 썼다. 예제에 필요한 클래스들을 대충 정리하자면 아래와 같다. Member 관련 Member MemberRepository : 멤버 저장 DAO MemberService : 멤버Repository를 호출해서 실제 회원가입과 회원찾기 기능을 해주는 부분 Grade enum : 등급별로 멤버들의 할인정책이 바뀌기 때문에 어떤 등급의 멤버인지 등록할 때 사용한다. Order 관련 OrderService : 주문 생성에는 멤버정보 / 할인정보 / 상품정보가 필요하다. Orde..
들어가기 저번에 FeignClient로 다른 API를 호출할 때 그 API에서 반환한 Json 객체를 Java Object(Response객체)로 담는 과정에서 Java Object에 빈 생성자를 넣지 않아 에러가 난 적이 있었다. 지난 번엔 이걸 알아보기 전에 자바 소스 코드가 실행되는 과정을 다시 공부했었다. 보다보니 기본 API에 대해서도 잘 모르는 것 같아서 기본적인 API를 개발한 뒤 이걸 호출할 때 java 내에서 무슨 일이 발생하는지 순차적으로 알아보려 한다. https://eocoding.tistory.com/117 Java 안에서의 Interpreter와 Compiler 들어가기 직렬화 객체에 빈 생성자를 넣지 않았다가 Feign으로 외부 API 호출 시 에러가 났다. 그래서 직렬화 객체..
최근 우리 팀 서비스 중 이미지가 업데이트되지 않는 문제가 있었다. Redis에 올라간 데이터인데 TTL 이 없어서 그동안 업데이트가 되지 않은 게 원인이었다. TTL 이 없다고? 라는 충격과 함께 이번 기회에 우리팀 Redis가 어떻게 쓰이고 있는지 현황을 파악하는 시간을 가졌다. 1. key 추출 2. TTL 추출을 어떻게 할지에 대한 고민 : 결국 노가다 살짝ㅠㅠ 3. 히트율 계산 4. 결론. redis를 캐시의 관점에서 사용하자. 5. 파생 가능한 주제 : 로컬 캐시와 글로벌 캐시 활용, 적절한 TTL이 뭘까? 1. key 추출 일단 전체 key를 추출해야했다. 약 180만개 정도 있어서... 이게 과연 될까 싶었지만 추출되긴 했다. redis-cli --raw -p [포트번호] -h [레디스서버..
들어가기 직렬화 객체에 빈 생성자를 넣지 않았다가 Feign으로 외부 API 호출 시 에러가 났다. 그래서 직렬화 객체는 왜 빈 생성자가 필요한지 알아보려했다. 그러다보니 Reflection을 알아야 했고, 그러다보니 Java의 클래스가 로드되는 과정을 알아야 했으며, 그걸 보다 보니 Java의 소스 코드가 실행되는 과정을 알아야 했다. 예전에는 단순히 컴파일러와 인터프리터를 비교하고, 자바는 이 둘 다가 같이 쓰인다는 것까지만 이해했는데, 그보다 더 많은 내용이 있었다. 본래 알고 싶었던 빈 생성자와 reflection에 대해서는 다음으로 넘긴다ㅠ 나 분명 reflection 공부하려 했는데ㅠㅠㅠ 항상 공부하다보면 판도라의 상자 마냥 .. 모르는 게 많아서 끝도 없이 다른 주제로 가지가 쳐진다...^_..
서론 우리 회사 프로젝트는 MSA 구조를 이루고 있는데 그동안 나는 다른 MS를 호출할 업무가 없었어서 직접 써본 적은 없었다. 근데 이번에 FeignClient로 다른 MS의 API를 호출할 일이 생겨서, 외부 API를 호출하는 여러가지 통신 방법들과 간단하게 비교하려고 한다. 이번 포스팅은 스윽 훑어보는 거라 아직 제대로 흡수하지 못한 특징들도 있는데, 앞으로 구체적인 사용법을 공부할 예정이다. Spring Cloud MSA의 개발, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반의 프레임워크. MSA를 위한 환경설정, 서비스 검색, 라우팅, 프록시 등 분산시스템 설정을 빠르게 할 수 있도록 도와준다. 여기서 지원하는 요소들은 대표적으로 아래와 같은데 이번 ..