_

Always be tactful

분류 전체보기 121

05. 현대 소프트웨어 아키텍처에 대한 고찰

싱글톤 패턴의 출현설계를 하다 보면, 애플리케이션 전반에 걸쳐 유일하게 존재해야 하는 객체가 있다. 싱글톤 패턴은 불필요한 리소스 낭비를 방지할 뿐 아니라, 관리를 용이하게 한다는 점에서 한때 각광받던 디자인 패턴 중 하나다. 어디서든 쉽게 접근해서 쓸 수 있다는 점도 개발자들에게 충분히 매력적으로 느껴졌을 것이다. 마치 전역 변수처럼 편의성을 제공하면서도 최소한의 객체 지향 원칙을 지키는 듯 보였으니 말이다. 하지만 싱글톤 패턴의 가장 고질적인 문제는 강한 결합에 있었다. 싱글톤에 의존하는 클래스들은 싱글톤의 존재를 직접적으로 알게 되고, 이는 곧 테스트를 매우 어렵게 만든다는 말과 같다. 싱글톤의 상태가 전역적으로 공유되기 때문에, 예측 불가능한 사이드 이펙트가 발생하기 쉬웠으며, 병렬 처리 환경에서..

MAIN/IMDEF 2025.07.26

04. Spring Initializr & Dependencies

Spring Initializr는 스프링 프로젝트를 생성할 때 유용한 웹페이지다. 간단한 게시판 기능을 만들기 위해 의존성을 몇 가지 추가하였는데, 어떤 의존성들을 추가했으며 왜 추가했는지 알아보자.Spring WebSpring Web은 RESTful 애플리케이션을 구축하고 Spring MVC를 사용하여 웹 애플리케이션을 개발하는 데 필요한 핵심 기능을 제공한다. 기본적으로 내장된 Tomcat 서버를 포함하고 있어 별도의 웹 서버 설정 없이 바로 실행 가능하다. 가장 먼저 개발할 Comment API는 사용자의 요청(댓글 등록, 댓글 조회 등)을 처리하고 응답(JSON 데이터)을 반환하는 웹 애플리케이션이다. Spring Web은 이러한 웹 요청을 처리하고, 컨트롤러를 통해 비즈니스 로직을 연결하며, 뷰..

MAIN/IMDEF 2025.07.25

03. 이미지, 도커 파일, 도커 컴포즈란 무엇인가

일반적으로 개발이나 DevOps 맥락에서 '이미지'라고 함은 거의 대부분 '도커 이미지'를 의미한다. (가상 머신 이미지, 디스크 이미지 같은 다른 종류의 이미지도 있긴 함). 아무튼 이미지라는 표현은 도커가 제공하는 환경의 일관성, 재현성, 경량성이라는 핵심 가치를 직관적으로 전달하기 위해 쓴다고 보면 되는데, 무슨 말인지 이해하기 어려우니 풀어서 이야기해 보자. 이미지라는 단어는 시각적인 스냅샷을 연상시킨다. 특정 시점의 파일 시스템과 설정 상태를 그대로 찍어낸 사진이라고 생각하자. 예를 들어 MySQL 도커 이미지라고 할 때, 특정 MySQL 버전과 그 실행에 필요한 모든 파일 및 설정이 고정된 상태로 패키징 된 스냅샷인 것이다. 특정 프로그램을 실행하는 데 필요한 모든 것을 담고 있는 읽기 전용 ..

MAIN/IMDEF 2025.07.24

02. 개인 프로젝트인데 도커 왜 써?

일단 MySQL은 가장 보편적인 데이터베이스다. 그리고 운영체제에 맞춰 직접 설치해 사용하면 된다. 그럼에도 불구하고 도커를 사용하는 이유는, 그만큼 시스템 환경에 종속되어 다른 개발자와 동일한 환경을 맞추기 어렵기 때문이다. ..라고 지금까지는 얘기해 왔다. 그런데 한 가지 따져볼 게 있다. 그저 평범한 개인 프로젝트에 불과한데, 타 개발자와 공유할 일이 있을까? 있긴 한가? 없다면 왜 쓰지? 사실 도커를 사용하는 이유는 단순히 다른 개발자가 나와 환경을 맞추기 위해서가 아니다. 도커는 오직 나 혼자 개발하더라도, 내가 편하기 위해서 채택하는 것이다. 그리고 그 이유는 환경 관리에 있다. 만약 A 프로젝트는 MySQL 8.0이 필요한데, B 프로젝트는 MySQL 5.7이 필요하다면?만약 C 프로젝트도 ..

MAIN/IMDEF 2025.07.23

01. 간단한 기획 후, API 명세를 작성해 보자

일단 만들고, 필요에 의해 개선하자. 무턱대고 정답에 가까운 방법을 엿들어 개발하는 일은 없도록 하자. 이번엔 간단한 웹 사이트를 하나 개발할 생각이다. 내가 작성한 게시물이 하나 있고, 그 게시물에는 여러 사람이 댓글을 남길 수 있도록 만들 것이다. 고려해야 할 사항은 다음과 같다. 게시물은 나(어드민)만 작성하고 수정할 수 있어야 한다.게시물에는 여러 사람이 작성한 댓글들을 순차적으로 보여준다. 논리구조상 게시물이 먼저 구현되어야 할 것 같은데, 게시물 작성 및 수정에는 특수한 조건이 필요하므로 댓글 기능 먼저 구현하기로 하였다. 댓글 기능에도 사실 추가하고 싶은 게 몇 가지 있지만 일단은 익명으로 누구나 작성할 수 있도록 개발해야겠다. API 명세부터 작성해 보았다. 혼자 진행하는 프로젝트라 꼭 선..

MAIN/IMDEF 2025.07.22

00. 지난 8개월에 대한 회고

어느덧 개발을 시작한 지 8개월이 지났다.백엔드 개발자가 되기로 마음을 먹었음에도, 지난 8개월을 돌이켜 보면 잘 산 건지 모르겠다. 분명 바쁘게는 산 것 같은데, 기존 학업과 병행하느라 유독 지치고 방황했던 시간들이었다.공부를 시작한 지 한 달이 되었을 때, 을 1회독하고 참가한 데이터 분석 프로젝트에서는 팀장을 맡아 전체적인 기획과 데이터 전처리, 시각화를 담당했다. 성과는 좋았으나 백엔드 개발자의 방향성과는 전혀 맞지 않는 경험이었다.그래도 덕분에 좋은 사람들을 만날 수 있었다. 충남연구원에 재직 중인 분께서 다른 팀이었음에도 유독 나에 대한 격려와 칭찬을 많이 해주셨는데, 그때 받았던 따스함이 오늘날까지도 기억에 남는다. 프로젝트가 끝나고, 술 한 잔 사주시면서 언제든 부르라고 하셨는데 실제로 연..

MAIN/IMDEF 2025.07.21

H씨가 말하는 협업을 위한 8가지

1. 혼자 할 수 있는 건 한계가 있다.- 잘하는 사람이 본인밖에 없다고 생각하며 혼자 독주하지 말자. 언제나 팀에게 진행상황을 공유하자.- 내가 잘하는 무언가에 심취하지 말자. 그들은 다른 분야에서 더 뛰어날 수 있다.협업은 목표를 공유하면서도 각자의 전문성을 더 잘 발휘할 수 있도록 서로 돕는 것이다. 2. 개발은 코드로만 하는 게 아니다.- 코드를 작성하지 않더라도 팀원과 함께 하는 모든 행위가 개발이고 비즈니스라는 점을 기억하자.내가 만드는 비즈니스의 가치를 높이기 위해 돕고 도움받아 문제를 해결하는 모든 과정 또한 개발이다. 3. 문서화는 결코 기획 인원만의 업무가 아니다.- 문서화의 중요성은 처음부터 나타나지 않는다. 처음에는 모두가 기억하기 때문이다.- 기획을 모르는 개발자는 개발자가 아니다..

NOTE/Feedback 2025.07.20

Variable Hiding / Shadowing

자바 상속과 관련하여과거, 김영한님의 자바 강의를 통해 상속의 개념과 다형성, 메서드 오버라이딩에 대해 학습했다. 비슷한 내용으로 글도 올렸었는데, 이번에 정보처리기사 실기를 벼락치기 하는 과정에서 무언가 착각을해도 단단히 착각했다는 것을 깨달았다. 자바에서는 상속 관계에 있는 클래스들 간에 이름이 같은 멤버가 있을 때, 변수 숨김 또는 메서드 오버라이딩이 동작하게 된다. 내가 착각하고 있던 부분은 변수 또한 메서드 오버라이딩처럼 동작할 거란 막연한 생각이었다. 아래 예시를 보자.public class Main { public static void main(String[] args) { Base a = new Derivate(); Derivate b = new Derivate(); ..

MAIN/Java & Spring 2025.07.19

자료구조 힙(Heap), 자바에 TCO가 없는 이유는?

들어가며자바에서는 java.util.PriorityQueue라는 표준 라이브러리에서 우선순위 큐(최소 힙)를 편리하게 제공하고 있다. 그럼에도 불구하고 힙의 동작 원리를 직접 파고들어 구현 방법까지 알아두는 것은 단순히 라이브러리 사용을 넘어, 자료구조에 대한 더 깊은 이해를 돕는다.힙(Heap)은 우선순위 큐 구현부터 다익스트라, 프림 알고리즘 등 다양한 곳에 활용되는 중요한 자료구조다. 이번 포스트에서는 "힙이란 무엇이고, 어떻게 동작하며, 왜 그렇게 동작하는지" 그리고 "배열을 사용한 직접 구현 과정과 최적화 가능성"까지, 여러 궁금증을 바탕으로 알기 쉽게 설명하고자 한다.힙(Heap)이란 무엇인가?힙은 완전 이진 트리의 한 종류이며, 다음과 같은 중요한 특징을 지닌다.힙 속성(Heap Proper..

MAIN/Java & Spring 2025.06.27

JPA 프로젝트에서 타임스탬프 자동화를 위한 세 가지 전략

타임스탬프타임스탬프(Timestamp)는 어떤 사건이나 데이터가 발생한 정확한 시간을 기록한 값이다. 예를 들어 특정 데이터가 생성된 시점이나 수정된 시점을 저장하는 데 사용된다. 타임스탬프는 왜 남겨야 할까?1. 데이터가 언제 생성되고 수정되었는지가 기록되기 때문에 변경 내역을 명확히 알 수 있다. 따라서 시스템 장애나 보안 사고 발생 시, 언제 어떤 변경이 있었는지를 추적하고 원인을 규명할 수 있다.예를 들어, 은행 시스템에서 고객 계좌 정보가 잘못 변경되었다고 가정하자. 타임스탬프가 남아 있다면 누가 언제 계좌 정보를 수정했는지 정확히 알 수 있고, 문제가 발생한 시점을 추적하고 원인을 파악해 빠른 대응이 가능하다. 단순히 기록을 넘어 실시간 문제 대응 및 복구 작업의 도구로 활용될 수 있다. (E..

MAIN/Java & Spring 2025.06.10

토스페이먼츠 3년 이하 서버 개발 챌린지

후기어느덧 개발을 시작한 지 반년이 지났다. 처음 시작했을 때보다는 확실히 아는 것도 많아지고 점차 익숙해지고 있지만 여전히 부족하다. 스스로 부족한 걸 알기에 감히 이력서를 넣을 생각은 추호도 없었다. 그러다 정말 감사하게도 지인의 추천으로 토스 서버 개발 챌린지에 지원하게 되었다. "과제 테스트 경험이나 해 보자"라는 생각을 가지고 지원했기 때문에 큰 부담은 없었다. 심지어 하나도 못 건드리고 끝날 거라 생각했는데 그래도 6개월 간 열심히 공부해서 그런지 풀 수 있는 문제가 있었다. (테스트에 대해 하고 싶은 얘기는 많지만 보안 서약을 했기 때문에 적을 수 없음) 아무튼 당연한 얘기겠지만, 나는 과제 전형에서 탈락했다. 모든 프로세스가 낯설었지만 낯설었기 때문에 더 가치 있는 경험이었다. 다음 주에는..

MAIN/Challenge 2025.06.06

Common vs Global: 패키지 구조 이해하기

들어가기 전에가장 흔하게 사용되는 Common 패키지에 대해 말하자면, 결국 핵심은 구조화 및 가독성 향상이다.프로젝트를 진행하다 보면 프로젝트 내 여러 모듈이나 레이어에서 공통으로 쓰이는 코드가 생기기 마련이다. 코드 재사용성을 극대화하고 중복 코드를 방지하기 위해, 나아가 유지보수 측면에서 편리하기 위해 우리는 공통 코드들을 따로 빼게 된다. 이러한 코드들의 모음집이 Common 패키지인 셈이다.※ 사실 패키지 구조라는 게 명확한 답이 있는 건 아니다 보니 가벼운 마음으로 읽었으면 한다. Common vs GlobalCommon으로 퉁쳐서 사용하는 경우가 많은데 사실 Common 패키지와 Global 패키지는 서로 의미가 다르다.Common: 공통으로 사용되는 모든 코드를 모아두는 패키지Global:..

MAIN/My Study 2025.06.05

.prettierrc

import 정렬하기Code formatter로 Prettier를 쓰고 있었다.그동안 import는 신경 쓰지 않고 살았는데, 프로젝트 규모가 커지면서 상당히 지저분해짐을 느꼈다. 찾아보니 sort-imports 익스텐션을 추천하더라.그러나 막상 적용하고 보니 정렬 기준이 이상했고 커스텀하기도 어려웠다. 다른 방법도 여럿 시도했지만 썩 마음에 들지 않았다. prettier-plugin 사용하기결국 선택한 방법은 Prettier 플러그인을 사용하는 것이다.(그동안 Prettier 플러그인으로 sort-imports가 있는 줄 몰랐다.)# 플러그인 설치npm install --save-dev prettier @ianvs/prettier-plugin-sort-imports플러그인 설치 후, 루트 디렉토리에 아..

MAIN/My Study 2025.06.04

JPA 스펙에는 컬럼 순서에 대한 명확한 규정이 없다.

JPA와 컬럼 순서최근, ReadWe 프로젝트를 시작했다. 가장 먼저 Sign-up API를 설계하고 테스트해 보았는데, 엔티티 클래스에서 선언한 필드들이 정작 DB에 생성된 테이블을 보니 컬럼 순서가 뒤죽박죽이었다. 이유는 간단했다. JPA는 기본적으로 자바 리플렉션을 통해 엔티티 클래스의 필드 정보를 읽어온다. 그런데 리플렉션으로 필드 정보를 읽을 때는 자바 소스 코드에 작성한 순서가 보장되지 않는다. 쉽게 말해 아래와 같이 코드를 작성해도 DB에 생성된 테이블에서는 순서 상관없이 나타날 수 있다.@Entity@Table(name = "User")public class User { private String userId; private String email; private Strin..

MAIN/Java & Spring 2025.05.28

Database driver: undefined/unknown

문제 상황Spring Boot 3.4.3에서 JPA를 추가하니 아래와 같은 로그가 출력되었다. Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 9.3 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown 해결 방법연결부터 제대로 해야 한다는 생각에 고칠 생각부터 했다. "왜..

MAIN/My Study 2025.05.24

Docker Compose에서 MySQL 데이터 영속성 설정하기

🐳 도커 컴포즈최신 버전에서는 Docker Desktop이 기본적으로 Docker Compose v2를 포함하고 있어서 별도로 설치할 필요 없이 사용할 수 있다.과거에는 도커 컴포즈가 별도 바이너리로 취급되어 직접 설치하는 과정이 요구되었으며, dokcer-compose 명령어를 사용했다.# 설치 확인docker compose version# 출력 예시Docker Compose version v2.34.0-desktop.1docker-compose.yml # 기본 공통 구성docker-compose.override.yml # 로컬 전용 설정 (자동 인식)docker-compose.prod.yml # 운영 환경 전용.env # 환경변수데이터..

MAIN/My Study 2025.05.23

Spring Boot 드라이버 인식 오류 (driver-class-name)

📢 해결법이 궁금하신 분은 맨 밑줄만 보세요.도커로 MySQL 띄우고 연결하는 과정에서 드라이버 인식 오류가 발생했다.application.yml에서 MySQL 드라이버를 못 찾고 자꾸 mysql 패키지를 생성하겠냐는 알림이 떠서 난감했다.# 오류 발생 구문driver-class-name: com.mysql.cj.jdbc.Driver사실 스프링 부트는 드라이버명을 적어주지 않아도 알아서 찾아준다.그러나, 적었을 때 발생한 오류에 대해 해결하고 싶었다. (단순히 생략해서 해결하고 싶지 않았음) AI한테 물어보니 Gradle 빌드 파일을 다시 확인하라더라.의존성 주입이 안 된 것 아니냐는 의미였는데 내가 실수했을 리 없었다.Gradle 리프레시를 안 해서 그렇다는 답변도 받았는데, 역시나 말이 안 된다. ..

MAIN/Java & Spring 2025.05.23

Spring Boot에서 JPA로 Docker MySQL 연동하기

들어가며자바는 프로그래밍 언어고, 스프링은 자바 기반 웹 애플리케이션 프레임워크다.그런 스프링을 더 쉽게 쓰도록 돕는 툴킷이 스프링 부트다. ▼ 과거 배포 과정 (대략적)더보기WAS 설치 (서버): 톰캣 같은 WAS를 OS에 설치하고 직접 설정IDE 내 개발: 이클립스 같은 IDE에서 복잡한 코딩 후 컴파일WAR 생성 (파일): 애플리케이션을 .war(웹 아카이브) 파일로 패키징WAR 배포: 톰캣 같은 WAS의 'webapps' 폴더에 넣거나 직접 업로드하여 배포웹 앱 실행: WAS가 WAR 안에 들어있는 웹 애플리케이션을 풀어 서버 구동▼ 스프링 부트 도입 후더보기WAS 직접 설치 및 설정→ WAS(톰캣)을 내장 서버로 포함하여 바로 실행 가능WAR 파일 생성 후 WAS에 배포→ 실행 가능한 JAR 파..

MAIN/Java & Spring 2025.05.22

자바 표준 라이브러리 함수 Arrays.sort()에 대하여

더보기최근 두 달 동안 너무 바빴다.본 전공(경영) 중간고사, 개인 과제, 팀 프로젝트개인 프로젝트(크롬 익스텐션 개발, 웹 보안 찍먹)멋사 아이디어톤 준비, 자격증 시험 등 아무튼 알고리즘을 놓고 산 지가 벌써 두 달 조금 안 된 것 같은데,조금이나마 여유가 생기기도 했고 입과 전까지 목표한 게 있어서 다시 시작했다. 문제는, 자바 자체를 오랜만에 봐서 그런가 조금 낯설었다.나름 백준 골드5인데 애초에 IDE 자동완성 도움이 컸던지라 프로그래머스부터 켰다. 수고스럽지만 직접 타이핑해서 풀어야지.. 프로그래머스에서 몇 문제 풀다 보니, 정렬 알고리즘이 필요했는데 당장 생각나는 게 거품 정렬이었다.근데 제출하고 나니까 몇몇 테케에서 시간초과가 뜨더라. 거품 정렬이 느린 건 알고 있었다.분명 더 효율적인 정..

MAIN/Java & Spring 2025.05.20