만들면서 배우는 클린 아키텍처 들어가며BEAT 프로젝트를 진행하면서, 코드가 점점 처음 설계한 아키텍처에서 멀어지는 걸 실감했다. 😭 특히, 기술 부채가 쌓이면서 계층 간 경계가 흐려지고, 의존성이 복잡하게 얽히는 문제를 자주 마주했다.앱잼 당시 빠르게 기능을 구현해야 했던 만큼, 하나의 서비스 레이어가 9개의 레포지토리에 의존하는 상황까지 발생했는데, 별다른 조치 없이 개발을 이어가다 보니 코드는 점점 복잡해졌고, 유지보수도 어려워졌다.결국 처음 설계했던 계층 구조의 원칙은 무너졌고, 수정할수록 의존성이 계속해서 얽히는 악순환이 반복되었다. 그 결과, 특정 비즈니스 로직을 변경할 때마다 불필요한 의존성까지 수정해야 하는 상황이 반복되었고, 이를 통해 모듈 간 경계를 명확히 유지하는 것이 얼마나 중요..
2024년 회고록 1편 바로가기 3월~5월SOPT와 함께 성장의 꽃을 피우다SOPT 활동은 2024년 내 삶의 가장 빛나는 순간이자, 잊을 수 없는 추억이 되었다. SOPT는 단순히 배우고 성장하는 공간을 넘어, 나를 진심으로 이해하고 응원해주는 사람들과의 만남을 선물해 주었다. 그들과 함께 나눈 시간은 단순한 경험이 아니라, 내 삶의 방향을 바꿔준 커다란 전환점이었다 ☺️ SOPT 활동을 돌아보며 뭉클한 마음이 드는 건, 그만큼 이 동아리가 내게 소중하고 고마운 존재였기 때문인 것 같다. 그래서, 지금 이 글을 읽고 있는 대학생이라면 망설이지 말고 SOPT에 도전해 보길 바란다! 이곳에서의 경험은 단순한 활동 그 이상으로, 당신의 삶에 큰 변화를 가져다줄 것이다. 자 이제, 본격적으로 회고를 시작해보..
더 큰 도약을 위해서 들어가며2024년은 나의 20대 중 최고의 한 해로 기억될 것 같다.매일을 후회 없이 살기 위해 노력했고, 덕분에 후회 없는 하루하루를 보낼 수 있었다. 물론, 후회 없는 나날을 보냈지만 행복한 일만 있었던 것은 아니다.때로는 너무 힘들어 지치는 순간도 있었고, 마음이 무너질 때도 있었다. 그럼에도 불구하고, 그런 경험들이 결국 나를 더 단단하게 만들었고, 나아갈 힘이 되어주었다.지난 한 해 동안의 경험들은 내게 소중한 자산이 되었다.실패를 두려워하지 않고 도전했던 순간들, 힘들어도 포기하지 않았던 시간들, 그리고 그 과정에서 만난 소중한 인연들까지 모두...2025년에는 어떤 일이 펼쳐질까? 두려움도 있지만 25살의 내가 이뤄낼 성과가 더 기대된다.그만큼 내가 내 길을 잘 헤쳐나갈..
들어가며 3주차 과제를 제출한 후 꽤 시간이 지났지만 회고록을 작성해본다. 이번 3주차 과제는 “로또”였다. 이전 기수에서도 동일한 문제로 3주차 과제가 진행되었고, 이번 7기에서도 같은 미션이 주어졌다.1주차 미션에서는 OCP(Open-Closed Principle)와 SRP(Single Responsibility Principle)를 준수한 도메인 설계에 중점을 두었다. 2주차에서는 1주차 내용에 더해 원시값 포장과 일급 컬렉션을 적용하는 데 집중했다. 이번 3주차에서는 앞선 두 주차의 내용을 바탕으로 싱글톤 패턴을 적용하는 데 중점을 두고 미션을 수행하였다. 3주차에서는 잘못된 입력 시 해당 부분부터 재입력하는 로직이 추가되었는데, InputView에서 모든 유효성 검증 로직을 처리하게 되면서 레이..
들어가며 2주차 과제를 제출한 후 이제야 회고록을 작성해본다. 이번 2주차 과제는 “자동차 경주”였다. 이전 기수에서도 2주 차에 동일한 문제로 과제가 나왔고, 이번 7기에서도 같은 미션이 주어졌다.지난번 미션을 구현할 때는 OCP(Open-Closed Principle)와 SRP(Single Responsibility Principle)를 지킨 도메인 설계에 초점을 맞췄었다. 이번에는 여기에 더해 원시값 포장과 일급 컬렉션을 적용하는 데 중점을 두고 미션을 진행하였다. 미션을 다 구현하고 나서는 스스로 나름 만족스러운 코드라고 생각했다. 그러나 스터디 팀원들의 코드 리뷰를 받고 나니, 내가 놓친 부분과 개선할 여지가 많았음을 깨달았다. 아쉬움이 남기도 했지만, 동시에 이런 피드백 덕분에 더 성장할 수 ..
들어가며 1주차 과제가 드디어 끝이났다! 이번 1주차 과제는 문자열 덧셈 계산기였다. 1주차 과제라서 지난 기수에 출제되었던 문제가 다시 나올 줄 알았는데, 예상과 달리 새로운 문제였다. 처음엔 조금 당황했지만, 한편으로는 새로운 문제를 풀어볼 수 있어 설레는 마음이 들었다. 😊 이번 미션을 구현하면서는 OCP(Open-Closed Principle)와 SRP(Single Responsibility Principle)를 준수한 도메인 설계에 초점을 맞추고자 했다. 프리코스에 참여하면서 확장 가능한 설계를 시도해봐야 겠다고 생각했는데, 이번 과제가 “덧셈 계산기”를 만드는 것이었다. 이를 접하자마자 자연스럽게 이런 고민이 떠올랐다. “나눗셈 계산기”, “뺄셈 계산기”, “곱셈 계산기”로 변경해야 한다면 ..
Factory Method - 시작 객체 생성을 공장(Factory) 클래스로 캡슐화 처리해서 대신 생성하게 하는 생성 디자인 패턴이다. 좀 더 자세하게 설명하자면, 클라이언트에서 직접 new 연산자를 통해 제품 객체를 생성하는 것이 아니라 대신 제품 객체를 생성할 공장 클래스를 만들고, 이를 상속하는 서브 공장 클래스의 메서드에서 여러 가지 제품 객체 생성을 각각 책임지는 것을 말한다. 이 패턴을 이용하는 이유는 객체간의 결합도를 낮출 수 있고, 유지보수에 용이해지기 때문이다. 💡 공장한테 요청하면 서브 공장 클래스의 메서드에서 제품을 생성한다는 말을 표현한 건 알겠는데, 그냥 한 공장에서 다 만들면 안돼? 왜 서브 공장이 필요한데?라는 물음이 생길 수 있다. 이를 이해하기 위해서는 먼저 Factory..
들어가며자바에서 동적으로 배열의 크기를 변경하기 위해 배열 대신 List를 사용하곤 한다. 그런데 클래스 선언 문법에 로 되어있는 코드를 보았을 것이다. 이걸 제네릭(Generic) 이라고 부르며, 제네릭 파라미터는 꺽쇠안에 포함하여 전달한다. 제네릭이 하는게 무엇이고, 왜 사용할까? 한번 알아보자. 제네릭 (Generics) 이란? ArrayList list = new ArrayList(); 제네릭(Generics)는 다양한 타입의 객체를 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하면, 객체의 타입 안정성을 높이고, 형변환의 번거로움을 줄여준다. 쉽게 말하면, 제네릭스를 사용하면 다루고자 ..
들어가며JAVA에서 this와 this()는 비슷하게 생겼지만 엄연히 다르다. 어떠한 차이가 있는지 예제 코드를 통해 이해해보자. this생성자의 매개변수의 ≠ 이름 인스턴스 변수의 이름class Car { String color; String gearType; int door; Car(String a, String b, int c){ color = a; gearType = b; door = c; } public static void main(String[] args) { Car c = new Car("black", "auto", 3); System.out.println(c.color); System.out.println(c.gearType); System.out.println(c.door); } } t..
개요 배포 스크립트에 현재 실행중인 프로세스의 PID를 kill -15로 종료시키는 명령을 추가했었다. 하지만 PID를 찾지 못하여 프로세스를 종료시키지 않아 포트충돌이 발생하였다. 왜 이러한 원인이 발생했는지 알아보자. (참고로 리눅스는 Ubuntu를 사용하였다.) 쉘 스크립트 란? 쉘 스크립트(Shell Script)는 리눅스에서 사용되는 스크립트 언어로, "특정한 명령어들을 순차적으로 실행하도록 한 스크립트 파일"이다. 쉘 스크립트 파일은 일반적으로 텍스트 파일로 작성되고 .sh 확장자를 가지고 있다. 또한 #!과 같은 shebang(셔뱅)으로 시작하여 현재 스크립트를 실행하기 위한 쉘 프로그램을 지정할 수 있는데, 우리가 사용할 Bash 스크립트는 첫번째 라인에 #!/bin/bash를 적어 지정할..