본문 바로가기

전체 글

(23)
도커 컨테이너의 격리 구조 (Namespace, Cgroup, 그리고 컨테이너) 도커 컨테이너는 일반 프로세스와 달리, 커널 수준에서 격리된 환경을 가진 프로세스다. 그렇다면 어떤 메커니즘으로 이 격리가 이루어지는 걸까?도커를 이해하려면 컨테이너를 알아야 하고, 컨테이너를 이해하려면 이를 구성하는 커널 요소들을 알아야 한다.Namespace란?리눅스 커널이 관리하는 시스템 리소스에 대해 프로세스마다 **독립된 뷰(view)**를 제공하여, 각 프로세스가 마치 격리된 환경에서 동작하는 것처럼 만드는 커널 메커니즘이다.리눅스 네임스페이스의 8가지 종류Namespace격리 대상설명Mount (mnt)파일 시스템 마운트 포인트컨테이너마다 별도의 파일 시스템 트리를 가지게 한다.PID프로세스 IDPID 공간을 격리한다. 서로 다른 PID 네임스페이스에 있는 프로세스는 동일한 PID를 가질 수..
“오늘은 써야지”를 여섯 번 되뇌며, 세 번 썼다. ‘오늘은 써야지.’이 말을 되뇌이며 블로그에 글을 올린 게 이번 글 포함해서 어느새 3번째 글이다.총 6주의 시간 동안, 주말이 되면 늘 다짐처럼 '오늘은 써야지…'라고 혼잣말을 하며 글을 썼던 것 같다.하지만 3주는 결국 업로드하지 못했다.왜 못 썼을까? 라고 질문을 한다면,단순히 귀찮아서가 아니다. 기술 블로그를 쓴다는 건 누군가에게 도움되는 정보를 정리하고, 읽는 사람에게 인사이트를 주어야 한다는 부담이 있어였다.‘그 정도는 써야 하지 않나’ 하는 완벽주의가 책상에 앉는 걸 더 어렵게 만들었다.사실 이 블로그 챌린지에 앞서 있었던 특강에서 “완벽주의를 버리고, 일단 써보자”는 조언이 있었다.나도 그 말에 고개를 끄덕였지만, 실제로 실행하는 건 또 다른 문제였다. 하루키의 말처럼 ‘일단 앉는 것이 중..
지금까지의 경험 정리 안녕하세요. 지금까지 개발자로 취업준비하고 개발자로 일하면서 해왔던 경험들을 간략히 써봤습니다. 1. 취업준비컴퓨터공학을 전공을 했지만, 실무에 투입되는 것이 두려웠던 저는 부트캠프 항해 99에 참여하게 됩니다. 그곳에서 당시에도 핫했고 지금도 여전히 핫한 Java와 Spring Boot를 집중적으로 공부했습니다. 99일 동안 팀 프로젝트를 계속 진행하며 개발의 기본기를 탄탄히 쌓았고, 수료 후 프리랜서로 취업해 삼성 프로젝트에 참여해 일하게 되었습니다. 🔗 항해 99 바로가기 2. 개발자로 일하기 (프리랜서)Spring Boot만 할 줄 알면 어떻게든 1년은 버틸 수 있을 줄 알았지만, 실제로 투입된 프로젝트는 MSA 구조로 다양한 기술 스택이 혼합된 환경이었습니다. Java(Spring Boot) ..
운영 코드 리팩토링 회고: XA Transaction과 에러 처리 개선 개요2024년 4월부터 12월까지 프로젝트 개발 및 운영을 진행하다가, 2025년 1월부터 새로운 프로젝트에 참여하게 되었다. 이후 기존 운영 중인 코드의 개선 작업 요청이 들어왔고, 시스템이 충분히 안정화된 상태라 이를 수행할 여유가 생겼다.단순히 기존 코드 스타일이 마음에 들지 않아서 수정하는 것이 아니다. 정상적으로 동작하지 않는 로직을 바로잡고, 불필요한 사용자 로그를 정리하며 코드 품질을 개선하는 것이 목표였다. 대대적인 개편보다는 점진적으로 코드를 개선해 나가는 방식을 택했다.참고로 현재 회사에서는 Mulesoft를 활용한 프로젝트를 진행하고 있다. Mulesoft는 여러 시스템, 애플리케이션, 데이터 소스를 쉽게 연결할 수 있도록 도와주는 Salesforce사의 통합(Integration) ..
no space left on device 해결 개요 도커 이미지를 빌드하는 과정에서 계속 no space left on device 에러가 떴다. 일단 말 그대로 디바이스에 공간이 없어서 발생하는 문제이기에 디스크 용량도 확인해보고 docker system prune으로 삭제도 해보았다. 결론은 docker system prune으로 해결. docker system prune 사용하기 docker prune은 사용하지 않는 도커 오브젝트(컨테이너,이미지,네트워크)를 정리해준다. $ docker system prune --help Usage: docker system prune [OPTIONS] Remove unused data Options: -a, --all Remove all unused images not just dangling ones --..
Postgres를 도커 컨테이너로 만들고 도커 컴포즈로도 관리하기 (with volumes) 개요 호스트 서버에 실제 데이터베이스를 설치하지 않고 도커로 구동하기 위해 PostgreSQL 도커 이미지를 받아와 컨테이너를 생성하였다. 컨테이너가 삭제되더라고 데이터는 영구적으로 저장하기 위해서 volumes를 mount하여 호스트 시스템의 지정된 디렉토리와 컨테이너 내부의 데이터 저장 경로를 연결하였다. Docker image pull 받기 docker hub에서 postgres docker image를 가져온다. 도커 이미지는 도커 컨테이너 생성을 위한 명령어가 적혀있는 템플릿이다. 이미지에는 어플리케이션을 실행하는데 필요한 코드,라이브러리,config file들이 포함되어 있다. docker pull postgres 명령어를 CLI 에 입력을 한다. 이렇게 하면 최신 버전의 docker imag..
toString을 재정의하기 (+ python) 개요 테스트코드에서 object의 필드값들이 다양한 type들로 이루어져 있었기 때문에 편한 게 String으로 변환하여 같은지를 테스트를 해보려고 했었다. 하지만 toString을 재정의해주지 않으면 최상위 클래스인 Object의 toString이 호출되어서 클래스풀네임@해시코드로 출력되기 때문에 원하는 행위를 하기 위해서는 반드시 재정의 해줘야한다. toString 용도 주로 디버깅하거나 로깅을 할 때 사용된다. toString()을 사용하면 객체를 문자열로 랜더링을 하여 객체의 내부 상태를 문자열로 반환할 수 있다. 문제 코드 public class Person { private final String name; private final String age; public Person(String n..
Service Layer에 Mockito를 사용하여 Unit Test하기 개요 service Layer만 단독 테스트하기 위해 Mockito라이브러리를 통해 Repository를 의존하지 않고 unit test를 진행하였다. stubbing을 했지만 동작을 하지않고 실제 메소드가 실행되면서 계속 값을 빈값으로 반환하는 에러가 발생하였다. 직접 Service에서 Repository를 직접 초기화해서 @Mock @InjectMocks에서 객체 주입을 받지 못하도록 하여 발생한 에러로 였다. 문제 테스트 대상 code // EmployeeService 클래스 @Service public class EmployeeService { private final EmployeeRepository employeeRepository = new EmployeeRepository(); public..