Spring Boot를 사용하면 Transactional이라는 어노테이션을 자주 접하게 된다. @Transactional은 스프링 프레임워크에서 트랜잭션을 선언적으로 처리하기 위한 어노테이션이다. 이 어노테이션을 메서드 또는 클래스에 붙이면, 해당 범위 내에서 실행되는 로직은 트랜잭션으로 감싸지며, 성공하면 자동 커밋되고, 예외 발생 시 자동 롤백되는 기능을 수행한다. Transactional 어노테이션의 역할을 알기 전, Transaction이 무엇인지 먼저 짚고 넘어가자. Transaction(트랜잭션)Transaction(트랜잭션)은 하나의 작업 단위(Unit of Work)를 구성하는 여러 개의 연산 집합(예: SELECT, INSERT, UPDATE, DELETE)으로, 모두 성공하거나 모두 실..
Pytorch를 이용하여 모델을 구현하다 보면 텐서 간의 덧셈, 곱셈 등 연산을 수행할 때 차원이 서로 다른 경우를 자주 만나게 된다. 그런데도 에러 없이 연산이 가능한 이유는 바로 Broadcasting 때문이다. Broadcasting은 Numpy에서 도입된 개념으로, PyTorch에서도 동일하게 적용된다. 이 기능 덕분에 복잡한 차원 조작 없이도 깔끔한 수식 구현이 가능하다.Broadcasting이란 서로 shape가 다른 두 tensor 간의 연산에서 작은 텐서의 shape을 자동으로 확장하여 큰 텐서와 연산이 가능하도록 맞춰주는 암시적(implicit) 규칙이다. 이는 개발자가 명시적으로 .expand()나 .repeat()를 호출하지 않아도 자동으로 연산되게 도와주는 기능이다. 아래의 조건이 ..
더티 체킹(Dirty Checking)더티 체킹(Dirty Checking)이란 객체 지향 프로그래밍 환경에서 객체의 상태가 변경되었는지 감지하여 데이터베이스에 자동 반영하는 메커니즘이다. 즉, 개발자가 직접 SQL UPDATE 명령을 작성하지 않아도, 객체의 속성을 변경한 후 트랜잭션을 커밋하면 자동으로 변경 사항이 DB에 반영되는 기능이다. 주로 JPA(Java Persistence API), Hibernate, SQLAlchemy 등 ORM(Object-Relational Mapping) 프레임워크에서 사용된다. 더티 체킹은 Python 환경에서도 사용되긴 하지만 주로 Spring Boot + JPA(Hibernate) 환경에서 가장 많이 사용되는 패턴 중 하나이다. 실무에서는 더티 체킹을 사용할 ..
Pytorch를 이용하여 코드를 구현할 때 데이터의 차원을 수정하거나 조작할 때 가장 많이 사용되는 함수는 view, reshape, transpose, permute이다. 이 함수들에 대해 제대로 된 사용법과 특징을 정리할 필요가 있다 생각하여 남겨두고자 한다. 또한 contiguous한 특성에 따라 어떤 함수를 사용하여야 하는지도 함께 정리하려 한다. view()메모리를 공유하며 차원 변경연속된(Contiguous) 메모리를 사용할 때만 가능원본 텐서와 메모리를 공유 (즉, view()를 바꿔도 원본도 바뀜) import torchx = torch.arange(6) # [0, 1, 2, 3, 4, 5]y = x.view(2, 3) print(y)# 출력# tensor([[0, 1, 2], # ..
Spring은 자바 기반 애플리케이션 개발에서 효율성을 높이고, 코드의 유연성과 재사용성을 극대화하는 데 중점을 둔다. 이 중심에는 Bean, Spring IoC(Inversion of Control), 그리고 의존성 주입(Dependency Injection, DI)이라는 개념이 있다. 이 글에서는 이 세 가지 개념을 하나씩 살펴보고, 스프링이 이를 통해 어떻게 애플리케이션을 관리하는지 설명한다. BeanSpring에서 Bean은 스프링 IoC 컨테이너가 관리하는 객체를 의미한다. 애플리케이션 실행 과정에서 생성되고, 필요한 곳에 주입되며, 생명 주기를 관리받는 객체이다. 아래는 Bean의 대표적인 특징 3가지이다.Bean은 스프링 컨테이너에 의해 등록되고, 생성되며, 관리된다.기본적으로 싱글턴(Sin..
Spring Boot로 서버를 만들며 시간에 쫓겨 프레임워크가 제시하는대로 구현은 했지만 세부적인 내용에 대한 이해가 부족하다고 느껴 기초부터 다시 정리하고 있다. 시작하기 전 Bean이 등록되고 준비되는 순서는 아래와 같다.@ComponentScan으로 클래스 경로에서 빈 정의 검색 - @Component, @Service, @Repository, @Controller@Configuration 클래스와 @Bean 처리 - 프록시를 생성하고, 의존성을 관리빈 생성(@Component 빈 먼저, @Bean 빈 나중에 생성 가능)의존성 주입(@Autowired, 생성자, 필드, 메서드 주입)빈 초기화(@PostConstruct, 커스텀 초기화 메서드) 애플리케이션 컨텍스트 준비 @Component@Compo..