전체 글 99

프록시의 한계와 해결방안(내부 호출)

Spring AOP의 특징 앞에서 알아본 바와 같이 Spring의 AOP는 프록시 기술을 기반으로 한다. 따라서 AOP를 적용하면 항상 프록시를 통해 Target의 메서드를 실행하게 된다. Spring은 또한 AOP를 적용하면 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 프록시 객체를 주입한다. 실제 객체를 직접 호출하는 경우는 없지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. 코드 예시 Advicer 코드 @Aspect @Slf4j public class CallLogAspect { // 메서드를 실행하면 해당 메서드 시그니처(메서드 이름)을 로그로 남기는 코드 @Before("execut..

Spring 2024.01.13

Object 메서드 정리

Object 메서드 Object.assign() : 객체가 복제된다. const user = { name : 'A', age : 20, } const cloneUser1 = user //복제된것이 아니라 객체 참조 값이 들어감으로 같은 주소를 가르킨다. const cloneUser2 = Object.assign({}, user); //{}로 정의된 빈 객체에 user가 들어감, user 내부의 인스턴스를 덮어쓰는 구조 -> 복제 Object.values() : 객체의 값을 배열 반환한다. const user = { name : 'A', age : 20, } var str = Object.values(user); console.log(str); /* ['A', 20] */ Object.entries() :..

JavaScript 2024.01.12

Spring AOP / @Aspect (JoinCut와 Advice)

AOP 용어 - Target : 부가기능이 적용될 타 - Advice : 부가기능을 수행하는 로직 - JoinPoint : Advice 가 적용될 수 있는 위치(모든 메서드)를 일컷는다. - PointCut : Advice가 끼어드는(적용 ) 위치 - Aspect : PointCut + Advice 를 의미 = Advicer 코드 예시) 1. Adivice에 바로 PointCut을 넣은 코드 @Slf4j @Aspect public class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", ..

Spring 2024.01.12

EC2 인스턴스 생성 및 Filezila 배포

1. AWS 인스턴스를 생성한다. 인스턴스의 OS는 Linux로 하였고 이외는 default 값으로 생성하였다. 인스턴스를 생성한 후 해당 인스턴스에 접근할 수 있는 대상을 보안 그룹으로 설정해야 한다. 2. 생성 시 키 페어를 다운로드한다. 나는 윈도우 사용자임으로 PuTTYgen을 통해 확장자를 pem -> ppk로 변경해 주었다. 페어키를 만든 후 2. PuTTY를 통해 AWS 서버와 커넥팅을 한다. Host Name에 ec2-user@aws인스턴스 주소를 입력하고 Port를 22 포트로 연결한다. 아래와 같이 커넥션이 연결되었다. 3. java 파일을 돌리기 위한 jdk 설치를 해야 배포가 가능하다. sudo install로 jdk를 버전에 맞게 설치를 해 준 뒤 4. Filezila를 통해 말아..

AWS 2024.01.12

리플렉션과 동적 프록시

이전 프록시 패턴과 데코레이션 패턴을 통해 부가 기능과 메인 로직을 분리하는 패턴에 대해서 알아보았다. AOP의 정의와 프록시/데코레이션 패턴 AOP의 정의 AOP는 관점지향프로그래밍이라 불리며 어떤 로직을 기준으로 핵심적인 로직과 부가적인 기능의 관점을 나누어 보고 그 관점을 기준으로 모듈화 한다. 흩어진 관심사를 묶고 비즈니스 programmingjun.tistory.com 프록시 패턴으로 분리는 가능하였지만 같은 부가기능을 각 로직별로 적용하고 싶다면 프록시 클래스를 하나하나 만들어 주어야 하는 불편함이 있었다. (재사용이 불가능함) 이 부분을 Java가 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스는 자바의 Reflection 기술을 통하여 프록시 객체를 동적으로 생성..

Java 2024.01.06

변수와 생성자 함수

변수 호이스팅 : 스코프 내부 어디서든 변수 선언은 최상위에서 선언된 것로 인식된다. TDZ : 변수에 값을 할당하기 전엔 사용할 수 없다. let은 스코프 단위에 적용되는 변수이다. 때문에 아래 코드는 애러가 발생한다. 이는 let 변수는 호이스팅이 되지 않는 것이 아니라 showAge()라는 function의 스코프 안에서만 유효하기 때문에 로그에 age 가 인식 되지 않는 것이다. let age = 30; function printAge(){ console.log(age); let age = 20; } showAge() //30 var 생성 과정: 선언 + 초기화 할당 let 생성 과정 선언 초기화 할당 let은 var와 다르게 선언과 초기화가 분리되어 있다. var는 변수 선언과 동시에 초기화 되..

JavaScript 2024.01.05

AOP의 정의와 프록시/데코레이션 패턴

AOP의 정의 AOP는 관점지향프로그래밍이라 불리며 어떤 로직을 기준으로 핵심적인 로직과 부가적인 기능의 관점을 나누어 보고 그 관점을 기준으로 모듈화 한다. 흩어진 관심사를 묶고 비즈니스 로직에선 분리하여 재사용 가능하게 한다. AOP(관점지향 프로그래밍)을 구현하기 위해 다양한 패턴이 등장했다. 대표적으로 템플릿 / 메서드 콜백 패턴과 프록시 / 데코레이션 패턴이 있다. 템플릿 / 메서드 콜백 패턴은 대표적으로 JDBC 템플릿이 있다. 템플릿 메서드 패턴의 단점으로는 추상화된 메서드 (추상 객체, 인터페이스)를 사용 시 직접 구현해야 하는 불편함이 있다. 템플릿은 객체를 생성하고 그에 맞는 파라미터를 넣고 기능을 다시 정의해야 하며 수정에 매우 불리하다(재정의된 메인 로직을 모두 찾아 다시 수정해야 ..

Spring 2024.01.04

의존 관계 자동 주입(@Autowired, @ComponentScan)

@ComponentScan @ComponentScan 어노테이션은 @Component 가 붙은 모든 클래스 스프링 컨테이너에 Bean으로 등록한다. 이때 @ComponentScan 가 붙은 클래스가 존재하는 패키지를 포함한 하위의 파일들을 Scan의 대상으로 한다. 클래스 상단에 @Component 어노테이션을 사용하여 기존 수동으로 하던 Config 클래스를 통한 @Bean 등록을 @Component와 @ComponentScan을 통해 자동화할 수 있다. Bean으로 컨테이너에 등록 되었다고 해서 의존관계에 있는 멤버 변수 (MemberService에서의 MemberRepository)가 주입이 된 것은 아니다. Spring은 이 또한 @Autowired 어노테이션을 통하여 의존관계 부여를 자동화하였다..

Spring 2024.01.02

트랜잭션과 격리 수준

트랜잭션 특징 원자성(Atomicity) 트랜잭션이 DB에 보두 반영되거나 모두 반영되지 않아야 한다. 일관성(Consistency) 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다. 독립성(Isolation) 한 트랜잭션이 동시에 병행될 때, 다른 트랜잭션이 연산에 끼어들 수 없다. 지속성(Durability) 트랜잭션이 성공적으로 처리되면 영구적으로 반영되어야 한다. Commit 과 Rollback Commit : 하나의 트랜잭션이 성공적으로 끝나 DB에 지속성을 만족시켰음을 알리는 연산 Rollback : 하나의 트랜잭션 처리 중 하나가 비정상이였을때 원자성이 깨져 원래 대로 돌린다. DBMS의 구조 DB의 구조는 Query Processor(쿼리 처리기) 와 Storage System(저장 ..

데이터 베이스 2023.12.29