전체 글38 요즘 일하면서 느끼는 거 내 연차 어느덧 4년차.. 미들을 바라보고 있다마음가짐이 많이 바뀌었는데먼저 나는 백엔드 엔지니어로 커리어를 시작했 지만.. 첫 회사에서 리액트를 함께 맡음에 따라 엥저는백엔드하고싶은데요? 다음 회사에서는 php를 하게 되었는데(공고+면접때 java로 마이그레이션한다는 이야기로 입사를 하였지만 메인서비스 유지보수하기 바빴음) 뭔가 도태되는 느낌도 많이 들었었고.. 스타트업 분위기가 좀 적응하기 힘들었음.. 다시 회사를 옮기게 되었다 사실 이 회사가 맘에 안들었다기보다는 여러가지 사정이 있었고.. 내가 부족했다고 생각함.. 이 과정 중에 헤드헌터한테 대기업 계열사 제안을 받게 되어서 도메인/커리어 상관없이 대기업의 맛을 맛보고싶다는 생각에 별 생각 없이 이직하게 됨...그리고 레전드 역마살으로 다음 회사... 업무..하면서 2024. 7. 29. 웹소켓 웹소켓에 대해서는 국비학원 다닐 때 채팅기능 구현해보기 실무에 들어가서도 거의 HTTP 통신만 다루며 api 서버 개발만을 맡게 되어... 이거 좀 알아봐야겠다 기회가 생겨 웹소켓에 대해 뜯어볼 건덕지가 생김 먼저 웹소켓이란..?'사용자의 브라우저와 서버 사이의 인터액티브 통신 세션을 설정할 수 있게 하는 고급 기술으로 개발자는 웹 소켓 API를 통해 서버로 메시지를 보내고 서버의 응답을 위해 서버를 폴링하지 않고도 이벤트 중심 응답을 받는 것이 가능하다'라고 mdn에선 정의한다...그러니깐 웹 브라우저와 웹 서버가 실시간으로 대화할 수 있게 하는 통신 방식인데 한 번 서버를 연결하면 계속해서 유지가 되기 때문에, 매번 연결을 하지 않아도 된다는 특징이 있다.. 따라서 채팅서버를 구현할 때 많이 사용하.. 프로젝트.. 하면서 2024. 7. 24. 다중 로그인 제어 적용하기 신규 서비스 개발 중... 회사 내규 보안 규칙을 적용해야 한다는 사항을 전달 받았다..1. 어드민 서비스에 sms 2차 인증 추가 -> sms api는 이미 구현 되어있었고, redis에 2차 인증이 되었는지 여부만 저장하여 최초 로그인 filter에 해당 로직만 추가함으로써 간단하게 구현할 수 있었다..2. 비밀번호 n회 이상 틀렸을 때 락걸기 -> redis로 할까 했는데.. db에 로그인 실패 카운트 횟수, 락 여부 컬럼 추가해서 구현 함3. 다중 로그인 제어 -> 이게 좀? 머리를 써야할 것 같았는데A PC로 접근 중, B PC로 접근했을 때 A PC의 로그인을 풀리게 하는 것이 요구사항이였고단순하게 아~ 토큰에 ip주소를 저장하고 접근할 때 이 ip주소가 다르다면 토큰 만료시키면 되겠다~~~라.. 업무..하면서 2024. 6. 29. spring event로 이벤트 아키텍처 적용하기 담당하게 된 회사 프로젝트의 코드를 살펴보면서, 결제 기능과 이메일 발송 로직에서 개선할 수 있는 부분이.... 보였다. (웬만한 실무 코드가 그렇듯이) 하나의 비즈니스 로직이 nn줄로 거대하게 존재하고 있는 상태였다...... 이런 중요한 기능들을 더 효율적이고 확장 가능하게 만들 수 있는 방법을 모색하는 과정에서, 몇 가지 중요한 개선 포인트를 발견했다.. 결제 기능의 확장성을 높이고, 공통 로직을 더 잘 관리하며, 이메일 발송을 비동기로 처리하는 방법을 고민하다 보니, 이벤트 아키텍처 도입입을 통해 시스템의 전반적인 성능도 개선할수 있어 좋은 해결책이 될 거라고 생각했다. 프로젝트의 현재 규모와 팀의 상황을 고려했을 때, RabbitMQ, Kafka와 같은 메시징 시스템을 도입하기보다는 Spring.. 업무..하면서 2024. 2. 2. 클린 아키텍처 적용하기 백엔드 개발에서 아키텍처는 마치 큰 건물의 기초와 같다. 잘 짜여진 아키텍처는 개발의 효율성을 높이고, 유지보수를 쉽게 해준다. 특히 Java Spring 프로젝트에서 클린 아키텍처를 적용하면 더욱 강력한 구조를 만들 수 있다. 이번 글에서는 내가 직접 경험한 클린 아키텍처의 적용 과정과 그 이점에 대해 소개하려 한다. 문제점: 컨벤션이 없는 아키텍처의 혼란 내가 처음 입사하여 프로젝트를 시작했을 때, 맡게 된 프로젝트를 포함하여 백엔드 파트 내부에선 아키텍처에 대한 명확한 컨벤션이 없었다. 이런 상태에서 개발을 진행하다 보니 코드의 일관성이 떨어지고, 새로운 기능을 추가하거나 수정하는 데 시간이 많이 걸렸다. 또한, 다른 개발자가 작성한 코드를 이해하기 어려워 협업에도 문제가 있었다. 접근 방식: 클린.. 업무..하면서 2024. 1. 16. Spring 로그 관리하기 입사 후 눈에 띄었던 첫 번째 문제는 로그에 대한 명확한 포맷과 관리 체계의 부재였다. 로그는 시스템의 건강 상태를 진단하고, 문제 발생 시 신속하게 대응하는 데 필수적인 역할을 한다. 로그가 잘 관리되지 않으면, 중요한 데이터의 누락이나 잘못된 기록으로 인해 성과 측정이나 문제 해결에 큰 어려움을 겪을 수 있다. 이에 로그 포맷을 정해보자는 의견을 제시하였고, 팀에서도 긍정적으로 받아들여줘 작업을 하게 되었다. (이는 후에 EFK 구축으로 넘어가게 된다..) 로그 분류와 기록의 필요성 데이터를 정확히 보기 위해, 데이터를 올바르게 기록해야 한다는 기본 원칙 로깅을 신경쓰지 않고 진행 ⇒ 특정 기능 배포 ⇒ 성과를 확인하려고 하니, 데이터에 누락이 있음을 발견(혹은 잘못된 로깅) ⇒ 다시 로깅을 한 후,.. 업무..하면서 2023. 12. 12. 현업에서 Spring Framework -> Spring Boot로 마이그레이션 하기 - 1 ✔ 발단 사내에서 프로젝트가 끝나고, 빈 시간이 남음에 따라 기존 Spring Framework로 구현된 레거시 프로젝트를 Spring Boot로 전환하는 작업을 시작하게 되었다. 전환하게 된 사유는 다음과 같다. 로컬 구동시간, 빌드 시간이 너무 길었다.. + 셋팅이 번거로웠음 로컬에서 프로젝트를 구동하는데 걸리는 시간은 7~8분 가량이였고, '이거.. .맞는건가?' 라는 생각이 들어 이전 직장에서 레거시 프로젝트를 전환해본 것을 경험삼아 리팩토링을 시작하게 되었다.. 빌드 시간 역시.. 5분은 거뜬하게 넘었고 Apache Tomcat 서버를 사용하고, 개발 환경에 DB DNS세팅까지 해야하는 번거로움이 존재했다. 입사하자마자 내가 담당하게 된 서비스임에도 어떻게 구성되어있는지 제대로 이.. 업무..하면서 2023. 9. 27. 02. 도메인 헥사곤으로 비즈니스 규칙 감싸기 도메인 헥사곤은 가장 내부에 있는 헥사곤이므로 그 위에 있는 어떤 헥사곤에도 의존하지 않는다 엔티티를 활용한 문제 영역 모델링 엔티티를 간주하기 위해선 엔티티가 식별자를 가져야 함 도메인 엔티티의 순수성 문제 영역 모델링의 핵심 -> 엔티티를 만드는 것 엔티티는 비즈니스 요구사항과 밀접한 관계를 가져야 한다 기술적인 요구사항으로부터 보호해야 함 -> 비즈니스 관련 코드와 기술 관련 코드가 혼동되는 것을 방지하자 관련 엔티티 Router 클래스에 있는 라우터들을 필터링하고 나열하는 retriveRouter 메서드... public static List retrieveRouter(List routers, Predicate predicate){ return routers.stream() .filter(pred.. 기술 서적 정리/만들면서 배우는 헥사고날 아키텍처 2023. 5. 1. 01 왜 헥사고날 아키텍처인가 헥사고날 아키텍처 이해 애플리케이션이 UI나 데이터베이스 없이 동작하도록 만드다? 비즈니스 코드를 기술코드로부터 분리 비즈니스 코드가 어디에 존재해야 하는지 기술 문제로부터 격리되고 보호돼야 하는 위치가 어디인지 도메인 헥사곤 생성 도메인 헥사곤? 소프트웨어가 해결하기를 원하는 핵시미 문제를 설명하는 요소를 결합한다. 엔티티, 값 객체 엔티티 (Entity) : 식별자(identiy)를 할당할 수 있는 것 값 객체(Value Object) : 엔티티들을 합성하기 위해 사용하는 불변 컴포넌트 애플리케이션 헥사곤? 도메인 헥사곤에서 나오는 비즈니스 규칙을 사용, 처리하고 조정 비즈니스 측면과 기술 측면 사이에 있으며 양쪽과 상호작용하는 중개자 역할을 함 포트와 유스케이스를 이용 프레임워크 헥사곤 외부 인터페.. 기술 서적 정리/만들면서 배우는 헥사고날 아키텍처 2023. 5. 1. 8장 의존성 관리하기 의존성 이해하기 변경과 의존성 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다 public class PeriodCondition implements DiscountCondition { private DayOfWeek dayOfWeek; private LocalTime startTime; private LocalTime endTime; // 실행시점의 ㅡ이존성 - Screening의 인스턴스가 존재해야 함 public boolean isSatisfiedBy(Screening screening) { // 구현시점의 의존성 : 의존 대상 객체가 변경되는 경우, 의존하는 객체도 함께 변경됨 return screening.getStartTime ...; } } 어떤 객체가 작업을 위해 다른 객체를 필.. 기술 서적 정리/오브젝트 2023. 4. 24. 7장 객체분해 프로시저 추상화와 데이터 추상화 프로시저 추상화는 소프트웨어가 무엇을 해야하는지를 추상화하고, 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다. 프로시저 추상화와 기능 분해 기능 분해 방법을 이용한 급여 관리 시스템 구축 `급여 = 기본급 - (기본급 * 소득세율)` 직원의 급여를 계산한다 사용자로부터 소득세율을 입력받는다 '세율을 입력하세요: ' 라는 문장을 화면에 출력한다 키보드를 통해 세율을 입력받는다 직업의 급여를 계산한다 전역 변수에 저장된 직원의 기본급 정보를 얻는다 급여를 계산한다 양식에 맞게 결과를 출력한다 '이름: {직원명}, 급여 : {계산된 금액}' 형식에 다라 출력 문자열을 생성 기능 분해 방법에서는 기능을 중심으로 필요한 데이터를 결정한다. 기능이 우선이고 데이터는 .. 기술 서적 정리/오브젝트 2023. 4. 9. 6장 메시지와 인터페이스 협력과 메시지 객체의 역할을 확장하여 더 큰 책임을 수행할 수 있게 하는 방법은 다른 객체와 협력해야 한다는 것이다. 한 가지 객체에는 한 가지 역할, 한 가지 책임만을 부여하고 다른 객체에게 메시지를 전송함으로서 협력 관계가 형성된다. 메시지 호출과 메서드 호출? 메시지를 수신했을 때 어떤 코드가 실행되는지는 메시지 수신자의 실제 타입이 무엇인가에 달려있다. 즉, 메시지 수신자가 인터페이스 타입으로 정의되어있는 경우 실제로 실행되는 코드는 인터페이스를 구현받은 클래스의 종류에 따라 달라진다. 메서드는 메시지를 수신했을 때 실제로 실행되는 함수이다. 동일한 메시지를 전송하더라도, 객체의 타입에 따라 실행되는 메서드가 달라질 수 있다. 즉 메시지가 전송되는 시점에서는 어떤 코드가 실행될 것인지는 정확히 알.. 기술 서적 정리/오브젝트 2023. 4. 3. 이전 1 2 3 4 다음