프록시란?실제 객체를 감싸고 그 객체에 대한 접근을 제어하는 대리자 역할을 하는 객체다프록시는 실제 객체 대신 클라이언트와 상호 작용하며, 필요할 때 실제 객체에 요청을 전달한다스프링은 프록시로 트랜잭션 관리, 로깅, 보안 등 다양한 부가 기능을 제공한다프록시는 스프링 AOP를 구현하는 핵심 기술이다당연한 얘기지만, 빈으로 등록된 객체에만 프록시를 사용할 수 있다프록시의 기본 개념대리자 역할클라이언트의 요청을 받아서 실제 객체에 전달한다이 과정에서 요청을 가로채고, 추가적인 작업을 수행할 수 있다투명성클라이언트는 프록시를 통해 실제 객체와 소통하지만 프록시 뒤에 실제 객체가 있다는 걸 모를 수도 있다프록시는 실제 객체와 동일한 인터페이스를 구현한다프록시 종류JDK 동적 프록시인터페이스를 구현하는 프록시 ..
3가지 방법이 있다@Autowired에 required false 옵션을 준다false 옵션을 주면 해당 빈이 없는 경우에는 아래 메서드를 아예 실행 시키지 않는다@Autowired(required = false)public void setNoBean1(Member noBean1) { 콘솔 출력}주입 받아야하는 빈에 @Nullable 어노테이션을 달아준다빈이 없는 경우에는 null을 반환한다@Autowiredpublic void setNoBean1(@Nullable Member noBean1) { 콘솔 출력}빈을 Optional로 감싸준다빈이 없는 경우 Optional.empty를 반환한다@Autowired(required = false)public void setNoBean1(Optional noBea..
@Transactional이란?스프링 프레임워크 어노테이션트랜잭션 경계를 정의하는 하나의 작업 단위이다지정된 경계안에서 데이터베이스 작업이 성공하지 않으면 롤백되도록 보장해준다즉, 작업 단위 모두가 성공해야 데이터베이스에 반영한다[[스프링이 데이터베이스 레벨의 트랜잭션을 추상화하여 다룬다]]트랜잭션 전파 (Propagation)@Transaction(propagtion = Propagation.옵션명)트랜잭션이 어떻게 전파될지를 설정할 수 있다이 말은 트랜잭션이 다른 트랜잭션과 어떻게 연관되는지를 정의하는거다예를 들어서 이미 시작된 트랜잭션이 있을 때 새로운 트랜잭션으로 시작할지 아니면 기존 트랜잭션에 합류할지 등을 설정할 수 있다옵션:REQUIRED (기본 설정)이미 트랜잭션이 존재하면 그 트랜잭션에 ..
@CreatedDate엔티티가 처음 생성될 때, 생성 날짜를 자동으로 설정하기 위해 사용되는 어노테이션이다.일반적으로 @EntityListeners와 같이 사용된다.@EntityListeners를 가지고 있는 엔티티에 특정 이벤트가 발생할 때(저장, 업데이트 등) 특정 리스너 클래스를 호출하도록 설정한다엔티티가 [[영속성 컨텍스트]]에 추가될 때 생성 날짜가 자동으로 설정된다.@SpringBootApplication이 있는 클래스에 @EnableJpaAuditing 어노테이션을 추가해야한다@Entity @EntityListeners(AuditingEntityListener.class) public class Entity { @Id @GeneratedValue(strategy = GenerationTy..
병렬처리란?여러 개의 작업을 동시에 수행해서 전체 처리 시간을 단축하는 방법을 말한다주로 멀티코어 프로세서를 활용하여 하나의 작업을 여러 부분으로 나누고 나눈 부분을 동시에 처리하는 방식이다자바에서는 주로 java.util.stream 패키지의 parallel stream이나 java.util.concurrent 패키지의 여러 클래스나 인터페이스를 사용해서 구현한다장점성능 향상여러 코어를 사용해서 순차적 처리보다 더 빠르게 완료할 수 있다대량의 데이터나 복잡한 계산을 처리할 때 좋다효율적인 자원 활용모든 코어를 효율적으로 사용해서 시스템 자원을 최대한 활용할 수 있다단일 코어에서 작업이 병목 현상을 일으키는 걸 방지한다응답 시간 단축병렬 처리로 작업을 나누어 동시에 처리하면 작업의 응답 시간이 줄어든다스..
람다란 ?익명 함수를 의미한다함수형 프로그래밍을 지원하기 위해 Java 8에서 도입되었다사용하면 코드가 간결해진다는 장점이 있다컬렉션과 Stream API를 사용할 때 매우 유용하다주로 [[함수형 인터페이스]]와 함께 사용한다왜 람다를 사용하나?코드 간결성 및 가독성 향상특히 컬렉션 요소를 처리하는 데 유용하다익명 클래스나 반복적인 코드없이 간단하게 기능을 정의할 수 있다함수형 프로그래밍 지원[[병렬 처리]] 및 스트림 API 강화람다 표현식은 스트림 API를 간결하게 작성할 수 있게 도와준다이벤트 처리 및 콜백 메커니즘 간소화비동기식 프로그래밍에서 콜백을 간단하게 정의할 수 있다함수형 인터페이스Consumerjava.util.function 패키지void accpet(T t)를 가지고 있다주어진 입력 ..
helpers와 utils 차이점처음 리액트로 프로젝트를 만들어보면서 모든 로직을 하나의 컴포넌트에 처리하는 멋진 개발을 했다!그러다 코드가 복잡해져서 여러 컴포넌트로 분리해야겠다는 생각에 리액트 프로젝트 구조를 좀 찾아보았다.다양한 글이 구조를 설명하지만 딱 정해진 구조는 없고 애플리케이션에 맞게 유동적으로 가져가면 되는 거 같았다.그중에서 helpers와 utils 디렉터리의 구분이 명확하게 이해되지 않았다. 좀 더 찾아보다가 나에게 가장 와닿는 설명을 해주는 블로그 글과 깃헙 이슈를 찾았다. helpers 폴더 정의 참고 블로그여러 블로그 글을 읽어보면서 helpers 폴더에 대해서 읽어봤지만 위 블로그의 설명이 나에게 가장 와닿았다. 해당 블로그에서는 특정 데이터를 가져오거나 특별한 작업을 수행하..
이번에 진행 중인 프로젝트에서 로그인 여부에 따라서 다르게 렌더링 해야 하는 컴포넌트가 늘어갔다.로그인 여부를 전달하기 위해서 내가 선택한 방법은 최상단 컴포넌트에서 토큰을 확인해서 변수에 담아두는 방식이었다. 그리고 이 값이 필요한 자식 컴포넌트의 props 값으로 로그인 여부를 전달했다.이러한 경우에는 A 컴포넌트는 로그인 여부 값이 필요하지 않지만 A 컴포넌트의 자식인 B 컴포넌트에는 그 값이 필요하기 때문에 A 컴포넌트도 로그인 여부 값을 가지고 있어야 한다. 컴포넌트 depth가 깊어 지거나 하면 관리가 복잡해지는 구조를 가지게 될 것이다. 그러다 React의 Context API를 알게되었다. context를 사용하면 데이터를 전역으로 관리하고 사용할 수 있다. const App = () =>..