본문 바로가기

전체 글33

[42GG] JPA UPDATE 로직 (영속성 컨텍스트, @DynamicUpdate, 벌크 연산) 42GG 프로젝트프로젝트를 진행하면서 엔티티를 업데이트하는 기능을 맡아서 구현하고 있다. 업데이트 관련된 로직에서 JPA는 더티체킹을 통해 엔티티 변경을 감지한다.그리고 보통 엔티티는 setter를 구현하지 않고 명확한 의도를 가진 메서드를 구현한다. 하지만 엔티티에 필드가 많아지게 된다면 setter를 대신하는 메서드를 모든 필드에 대해서 구현해야하는 불편함이 있다. 이를 해결하기 위해서 여러가지 방법을 생각해보다가이번에 승수님과 함께 해당 부분에 대해서 심도 깊은 논의를 진행했다. 먼저 JPA에서 업데이트를 수행하는 로직은 다음과 같이 3가지가 있다. JPA 영속성 컨텍스트와 더티체킹을 사용해서 업데이트한다.@DynamicUdpate를 사용해서 특정 컬럼만 업데이트한다.JdbcTemplate이나 Sp.. 2024. 7. 17.
[Spring MVC] @ModelAttribute 데이터 바인딩 문제점스프링을 처음 사용하게 되면 올바르게 요청을 보내도 데이터가 제대로 매핑되지 않아서 null값이 들어오는 경우를 만나게 됩니다. 대부분의 경우에 setter를 추가하게 되면 문제가 해결되지만, 객체지향적인 관점에서 setter는 지양해야하기 때문에 프로젝트에 setter를 작성하지 않는 규칙을 적용하는 경우가 있습니다.또한 기본 생성자 외에 다른 적절한 생성자가 있는 경우에도 데이터 바인딩이 제대로 되지 않는 경우도 있습니다. 여기서는 객체를 생성하고 초기화하는 경우의 수를 3가지로 나눠서 알아보고, 어떻게 작성하는 것이 좋을지 고민해보려고 합니다.@ModelAttribute란?@ModelAttribute를 사용하면 쿼리 파라미터 혹은 HTML Form를 통해 전달되는 파라미터를 객체에 매핑합니다... 2024. 7. 15.
[DevOps] 가상머신 (Virtual Machine) 가상머신 물리적 하드웨어(CPU, RAM, 하드디스크 등)를 소프트웨어로 구현한 것이다. 호스트(Host)는 VM(혹은 Hypervisor)가 설치되어있는 실제 컴퓨터 혹은 운영체제를 의미하며,게스트(Guest)는 VM(혹은 Hypervisor)을 통해 실행되는 가상 컴퓨터 혹은 운영체제를 의미한다. 하이퍼바이저(hypervisor)하이퍼바이저는 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼이다.유형 2 하이퍼바이저일반적인 가상머신 환경에서는 하이퍼바이저가 일반 프로그램과 같이 호스트 OS에서 실행되고, 이를 유형 2 하이퍼바이저 혹은 호스트 하이퍼바이저라고 한다.유형 1 하이퍼바이저이와 다르게 유형 1 하이퍼바이저는 호스트 OS를 두지 않고 하드웨어에서 직접 구동되어 게스트 O.. 2024. 6. 7.
[Python] 사과게임 이미지에서 숫자 추출하기 사과게임을 하다가 모든 사과를 다 제거할 수 있는 맵이 존재하는지 궁금해서파이썬으로 해당 맵을 체크할 수 있는지 확인하는 프로그램을 작성하려고 한다.개발환경Colab구글 드라이브 연동from google.colab import drivedrive.mount('/content/drive') 개발환경은 간단하게 Colab을 이용했으며, 환경 구성을 위해 구글 드라이브를 연동하고 OpenCV와 Tesseract 등을 추가적으로 설치했다.OpenCV 및 Tesseract 설치!pip install opencv-python!sudo apt install tesseract-ocr!pip install pytesseract OpenCV는 실시간 컴퓨터 비전을 목적으로 하는 오픈소스 라이브러리이다. C/C++ 언어로 .. 2024. 3. 7.
[Linux] Flex와 Bison 이 글은 flex & bison 책의 예제코드를 실행하는데 도움이 되기 위해 작성했습니다. Flex와 Bison의 문법에 대한 설명이 없으므로 예제코드를 이해하기 위해서 원문을 먼저 읽어보는 것을 권장드립니다. 이 글의 예제코드는 다음 출처에서 가져왔습니다. Chapter 1. Introducing Flex and Bison Flex Flex는 토큰을 저장해서 알맞는 enum 타입으로 변환하는 어휘 분석(Lexer)을 위한 도구입니다. Bison을 사용하면 헤더파일에 %token으로 등록한 토큰들이 enum으로 자동 생성됩니다. %{ #include "fb1-5.tab.h" %} %% "+" { return ADD; } "-" { return SUB; } "*" { return MUL; } "/" { r.. 2024. 2. 28.
[Linux] 쉘 변수와 환경변수 이 글은 shell에서 환경 변수를 참조하는 방법과 env에서 쉘 변수를 어떻게 지정하는지에 대해 다루고 있습니다. env 명령어 minishell 과제에서 built-in 명령어들은 모두 환경변수와 관련된 명령어 입니다. env 명령어는 옵션을 제외하고 다음과 같이 3가지 방식으로 사용할 수 있습니다. 1. 환경변수 목록 출력 # 입력 env # 출력 TERM_SESSION_ID=w0t0p0:4A2AC993-C7C8-4745-9387-F181921C1CC8 SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.bGePyIUzEC/Listeners LC_TERMINAL_VERSION=3.4.23 # ... 2. 하나 이상의 쉘 변수를 포함한 환경변수 목록을 출력 # 입력 env.. 2024. 2. 27.
[42Blind] Service 계층 통합 테스트 이 글은 NestJS를 사용하면서 Service 계층 통합 테스트에 대한 고민을 다룬 글입니다.아직 이해가 부족한 부분이 많기 때문에 더 좋은 방향을 알려주시면 큰 도움이 될 것 같습니다. 한 줄 요약SQLite In-memory DB를 활용한 통합 테스트를 진행하기로 결정했습니다.Github Action을 활용한 e2e 테스트에서 실제 배포 환경과 동일하게 구성하여 진행하고,필요시 Testcontainers를 도입하거나 단위테스트로 분리하는 리펙토링을 진행하기로 결정했습니다. Service 계층 테스트 문제점처음 테스트를 작성할 때, 모든 의존성을 Mock/Stub를 사용해서 단위 테스트를 작성하는 방식으로 접근했습니다.하지만 현재 비즈니스 로직은 단위 테스트를 진행할 만큼 복잡하지 않았고, Jest에.. 2024. 2. 25.
[42Blind] TDD와 Github action 도입 한 줄 요약현재까지의 개발 프로세스에 문제점을 느끼고 해결 방안으로 TDD를 도입하기로 결정했습니다. 테스트를 자동화하기 위해 github action workflows를 추가했으며, 런타임 환경이 추가됨에 따라서 환경변수를 정의하는 .env 파일을 분리했습니다. TDD 도입Github action workflows 추가OS: ubuntu-22.04DB: mysql 8.0.35 (default)Engine: Node.js 20.11.0Test: Jest ^29.5.0환경변수(.env) 분리.env.prod: 프로덕션 환경.env.local: 로컬 개발 환경secrets.ENV_TEST: github action 테스트 환경 개발 프로세스 문제점1. 지금 API 테스트 가능한가요? 프론트와 협업을 진행하면.. 2024. 2. 5.
[혼공컴운] 레지스터와 캐시 메모리의 차이가 무엇인가요? 레지스터 레지스터는 CPU가 연산을 위해 명령어와 데이터를 저장하는 위한 임시 저장 장치이다. CPU 안에는 목적에 따라 여러가지 레지스터들이 존재한다. ﹒프로그램 카운터(PC, Program Counter) ﹒명령어 레지스터(IR, Instruction Register) ﹒메모리 주소 레지스터(MAR, Memory Address Register) ﹒메모리 버퍼 레지스터(MBR, Memory Buffer Register) ﹒플래그 레지스터(FR, Flag Register) ﹒범용 레지스터 ﹒필요에 따라 누산기, 기억 레지스터, 주소 레지스터, 색인 레지스터 등의 기능을 수행 ﹒스택 포인터(SP, Stack Pointer) ﹒베이스 레지스터(BR, Base Regiester) 레지스터의 이름은 제조사마다 .. 2023. 11. 30.