본문 바로가기

반응형

Tech

(52)
[JPA] LazyInitializationException 과 OSIV 테스트 코드를 작성하다가 LazyInitializationException 에러가 발생하였다. 이슈에 대해서 찾아보니 JPA 의 lazy loading 과 관련된 이슈였으며, @Transactional 등을 사용하여 해결할 수 있었다. 오늘은 해당 이슈가 발생하고 이를 해결하면서 가졌던 의문점과 이에 대한 설명을 정리해본다. 1. LazyInitializationException 에러 설명 및 발생 원인 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.msa.dataset.domain.entity.Project.categories: could not initialize proxy ..
[SpringBoot] Logging - 3 (log4j2) 이전에 springboot 의 로깅 프레임워크를 공부하면서 logback 까지만 공부하고 사용했었다. 보다 최신 로깅 프레임워크인 log4j2 를 한번 들여다보고 싶었는데 기회가 없다가 이번에 개인 공부를 하면서 로그 환경을 설정할 기회가 있어서 log4j2 에 대해서 알아보았다. 1. log4j2 log4j2 는 자바 로깅 프레임워크 중 하나로 log4j 의 최신버전이다. 비동기 로깅을 통해서 logback 이나 이전버전의 log4j 보다 성능을 향상시킨 버전이다. Log4j2 기능 Async Logger log4j2 는 비동기 로깅 기능이 추가되었다. 비동기 로깅은 I/O 작업을 별개의 스레드에서 실행하도록 하여 애플리케이션의 성능을 향상시킨다. 이를 통해서 logger 가 처리할 수 있는 처리량이 ..
[Docker] Docker Root Directory (도커 스토리지) 변경 도커를 사용해서 개발을 하다보면 도커 이미지들이 계속해서 쌓이게 된다. 버전별로 빌드된 도커 이미지들은 작으면 몇 MB 에서 nvidia, gpu 와 관련된 이미지들의 경우에는 20GB 정도까지 용량이 커지곤 한다. 이러한 이미지들이 계속해서 쌓이면 로컬 디스크의 용량이 부족해지는 경우가 있다. 이 글에서는 이런 상황을 해결하기 위하여 마운트된 디스크와 같이 특정 위치로 도커 스토리지의 위치를 변경하는 법을 정리한다. 1. Docker Root Directory 도커 데몬은 도커와 관련된 파일들, 컨테이너 정보, 도커 이미지, 볼륨 정보, 서비스 정보 등등 도커와 관련된 정보들을 특정 디렉토리에 저장하여 사용한다. 이러한 디렉토리를 Docker Root Directory 라고 하는데 해당 디렉토리의 기본..
[Linux] 디스크 마운트 (fdisk, mkfs, mount, df) 서버의 디스크 용량을 확인하고 추가 디스크를 마운트 작업을 정리한다. 1. 디스크 상태 확인 서버의 현재 디스크 정보를 fdisk 명령어를 사용하여 확인한다. fdisk 명령어는 서버의 디스크 파티션 정보를 출력하거나 디스크 파티션을 조작하는데 사용하는 명령어이다. 아래와 같이 fdisk 의 l 옵션을 사용하여 디스크 파티션 목록을 확인할 수 있다. 디스크 파티션 조회 결과로 /dev/xvda 에 연결되어 있는 디스크와 /dev/xvdb 에 연결되어 있는 디스크 두가지를 확인할 수 있다. 이중에서 /dev/xvda 디스크는 /dev/xvda1 으로 파티션이 나누어 있지만 /dev/xvdb 디스크는 파티션이 설정되어 있지 않은 것을 확인할 수 있다. df 명령어로 디스크의 용량을 확인하면, 위의 이미지에서..
[Linux] 사용자 권한 (sudo, sudoers, chmod, chown) linux 서버를 사용하기 위해서 사용자 계정을 만들어서 사용하다보면 권한 문제에 부딪히게 된다. 서로 다른 사용자가 만든 파일에 접근하거나 시스템 설정 등을 위해서 root 권한이 필요하곤 하다. 이와 관련해서 sudo 권한과 파일의 권한을 조작하는 chmod, chown 등을 정리해본다. 1. sudo sudo 는 Super User DO 의 줄임말로 명령어의 앞에 붙여서 사용하는 명령어이다. 일반적으로 root 권한이 없는 사용자가 sudo 를 사용하여 superuser, root 권한으로 명령어를 실행할 수 있도록 해준다. 이를 통해서 시스템의 관리자 권한을 root 계정뿐만 아니라 여러명이 사용할 수 있도록 한다. - sudoers sudo 명령어가 어떤 명령을 실행할 수 있는지는 /etc/su..
[Linux] 사용자 계정 생성 (adduser, useradd) 서버를 운영하면서 root 계정이 아닌 각각의 사용자별로 계정을 생성해야했다. 이에 더해서 때로는 특정 계정이 sudo 를 사용할 수 있도록 sudo 권한을 부여해야 하는 경우도 발생하였다. 이와 관련해서 ubuntu 에서 계정을 생성하는 방법과 권한 부여와 관련된 내용을 정리하려고 한다. 이 글은 Ubuntu 20.04.3 LTS 버전을 기반으로 작성하였다. 1. ubuntu 계정 생성 ubuntu 에서 계정을 생성하는 명령어는 두가지가 존재한다. adduser 와 useradd 이다. 두 명령어는 모두 사용자 계정을 생성하는 명령어지만 계정 생성시에 계정 정보 입력, 홈 디렉토리 생성, 쉘 설정 등을 함께할 것인지, 계정만 생성할 것인지에 차이가 있다. adduser 의 경우에는 계정 생성시에 계정 ..
[SQLAlchemy] imperative mapping SQLAlchemy 의 ORM 기능을 사용하기 위해서는 DB 의 테이블과 애플리케이션의 클래스를 매핑해야 한다. SQLAlchemy 에서는 테이블과 클래스를 매핑하는 방법으로 두가지 방법을 제공해준다. 하나는 Declarative Mapping, 다른 하나는 Imperative Mapping 이다. Declarative Mapping 은 클래스를 구현할 때 SQLAlchemy 의 DeclarativeBase 를 상속받음으로 명시적으로 ORM 에 의해 매핑될 클래스로 선언하는 방법이다. 반면에 Imperative Mapping 은 일반 클래스를 SQLAlchemy 의 Table 객체를 registry 에 매핑하여 등록함으로써 해당 클래스와 테이블을 매핑시켜주는 방식이다. 프로그램을 구현하면서 파이썬 클래스..
[SQLAlchemy] Relationship - CASCADE SQLAlchemy 를 사용하면 여러 테이블간의 relationship 을 생성하여 운영할 수 있다. 테이블들의 relationship 다루어 운영을 하다보면 하나의 테이블에 대한 동작이 다른 테이블에 영향을 주는 경우가 발생한다. 이러한 경우 DB 를 다루기 위해 복잡하고 반복적인 작업이 필요할 수 있다. SQLAlchemy 에서는 관계가 맺어진 객체들간의 작업을 간편하고 자동화하기 위한 "relationship cascade" 라는 기능을 제공한다. 이 기능을 사용하면 relationship 을 가진 테이블간에 어떻게 동작할 것인지, 어떻게 영향을 끼칠 것인지를 정의할 수 있다. 1. Cascade 란? Cascade 는 SQLAlchemy ORM 기능으로 객체들간의 관계를 정의할 때 사용할 수 있는..

반응형