AOP (Aspect Oriented Programming)

여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법

-> 핵심 기능과 공통 기능의 구현을 분리하여, 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용하는 것

 

핵심 기능에 공통 기능(Aspect)을 삽입하는 방법에는 아래 세 가지가 있는데,

    1) 컴파일 시점에 코드에 공통 기능을 삽입하는 방법

    2) 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법

    3) 런타임에 프록시 객체를 생성해서 공통 기능을 생성하는 방법

 

Spring은 이 중 프록시를 이용한 세 번째 방법을 지원한다. (두 번째 방법은 일부 지원)

 

AOP 주요 용어

    . Advice: 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의

    . Joinpoint: Advice를 적용 가능한 지점을 의미(예를 들어 메서드 호출, 필드 값 변경 등)

     스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Joinpoint만 지원

    . Pointcut: Joinpoint의 부분 집합으로서 실제 Advice가 적용되는 Joinpoint 

     스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있음

    . Weaving: Advice를 핵심 로직 코드에 적용하는 것

    . Aspect: 여러 객체에 공통으로 적용되는 기능(예를 들어 트랜잭션이나 보안 등)

 

스프링에서 구현 가능한 Advice 종류

    . Before Advice: 대상 객체의 메서드 호출 전 공통 기능을 실행

    . After Returning Advice: 대상 객체의 메서드가 익셉션 없이 실행된 이후 공통 기능을 실행

    . After Throwing Advice: 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우 공통 기능을 실행

    . After Advice: 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 실행

    . Around Advice: 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행

 

예시

** 간단한 회원가입 API의 E-mail 형식 검증을 AOP로 구현

 

- Service Layer의 joinUser 메소드에만 AOP가 적용되도록 설정

package org.hsl.sample_api.aspect;

@Aspect
public class ValidationAspect {

    @Pointcut("execution(* org.hsl.sample_api.service.UserService.joinUser(..))")
    private void joinUserTarget() {}

    @Around("joinUserTarget()")
    public Object checkEmail(ProceedingJoinPoint joinPoint) throws Throwable {
        String email = (String) joinPoint.getArgs()[0];
        if( ValidationUtils.isNotValidEmail(email) ) {
            throw new IllegalArgumentException("유효하지 않은 이메일 형식입니다");
        }
        Object result = joinPoint.proceed();
        return result;
    }
}

- Bean 등록

package org.hsl.sample_api.config;

@Configuration
@EnableAspectJAutoProxy
public class AppCtx {
    @Bean
    public ValidationAspect ValidationAspect() {
        return new ValidationAspect();
    }
}

DTO와 VO는 둘 다 RDBMS의 record에 대응되지만

DTO는 데이터 전송용 mutable 객체이고 비즈니스 로직을 포함하지 않는다
VO는 값 그 자체로 의미를 지니는 immutable 객체이며 로직을 포함할 수 있다

 

주소, 이름, 돈도 단순히 문자열이 아닌 비즈니스 로직에 대한 책임이 있는 VO가 될 수 있으며

주소는 나라, 시, 도, 구, 상세 주소가 포함된 캡슐화된 로직과 객체

돈은 통화, 수치 로직이 포함된 객체가 될 수 있다.

 

그리고 이러한 VO 자체가 DTO가 될 수도 있다.

다만 DTO는 데이터 전송용 객체로 비즈니스 로직에 대한 책임이 없으므로, DTO가 VO라고 보기는 힘들다

 

DTO(Data Type Object): 계층간 데이터 교환을 위한 객체(Java Beans)

 

여기서 계층은 Controller, View, Business Layer, Persistent Layer 등을 의미

 

DTO는 로직을 가지지 않는 순수한 데이터 객체로 getter, setter 메소드만 가진 클래스를 의미한다.

public class PersonDTO {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

** DTO와 데이터 자동화처리

 

자바는 다양한 프레임워크에서 데이터 자동화처리를 위해 리플렉션 기법을 사용한다.

예를 들어, View에 있는 form에서 name 필드 값을 프로퍼티에 맞춰 넘기면, name속성의 이름이랑 매칭되는 프로퍼티에 자동으로 DTO가 인스턴스화 되어(프레임워크 내부에서 setter가 실행됨) PersonDTO를 자료형으로 값을 받을 수 있다.

 

참고로 자바의 프로퍼티(데이터)는 멤버변수 name, age로 결정되는 것이 아니라 getter/setter로 표현된다.

 

 

VO(Value Object): 특정 비즈니스 데이터를 담는 Immutable한 객체 

 

DTO와 비교했을 때 VO는 Immutable한 특성이 있으며 주로 같은 시스템 내에서 사용된다.

 

** DB Entity vs VO

 

DB entity는 식별자를 가지고 있고 식별자로서 동등성을 비교하지만

VO는 객체주소가아닌 값으로 동등성을 구별한다.

 

즉, VO 내부에 선언된 속성(필드)의 모든 값들이 같아야 똑같은 객체라고 할 수 있다.

따라서 Object 클래스의 equals()와 hashCode()를 오버라이딩 하여

서로 다른 이름을 갖는 VO 인스턴스라도 같은 객체라고 할 수 있다.

 

 

[참고 사이트]

https://lemontia.tistory.com/591

https://okky.kr/article/588264

'~2022 > Java' 카테고리의 다른 글

[Java] HashMap, HashTable, ConcurrentHashMap  (0) 2021.10.25
[Java] HashMap, TreeMap, LinkedHashMap  (0) 2021.10.25
[Java] Atomic Class  (0) 2021.10.12

SQL은 데이터베이스를 관리하기 위해 만들어진 프로그래밍 언어이며, 데이터베이스를 관리해주는 대부분의 DBMS(DataBase Management System; 오라클, MYSQL, MS-SQL 등)들은 SQL을 사용한다.

 

ANSI SQL은,

American National Standards Institute(미국 표준 협회)에서 정립한 Standard Query Language이다.

 

ANSI SQL은 모든 DBMS에서 호환는 SQL로,

Insert, Update, Delete, Join 등의 보편적인 쿼리 문법에 대해 특정 벤더에 종속되지 않는다는 장점이 있다. 

 

물론 특정 DBMS에서만 제공하는 함수를 사용하는 경우는 예외이다.

 

 

[참고 사이트]

https://lena19760323.tistory.com/60

https://tragramming.tistory.com/74

'~2022 > Database' 카테고리의 다른 글

[DB] Redis가 데이터 정합성을 보장하는 방법  (0) 2021.10.12

Docker란?

컨테이너 기반의 오픈소스 가상화 플랫폼으로, 다양한 프로그램과 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스로 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

 

여기서 컨테이너(Container)란, 격리된 공간에서 프로세스가 동작하는 가상화 기술이다.
VMWare나 VirtualBox 같은 가상머신이 호스트 OS 위에 게스트OS 전체를 가상화하는 방식과 다르게,
Docker는 단순히 프로세스만 격리시켜 필요한 만큼만 CPU나 메모리를 사용하므로 가볍고 빠르게 동작한다.

 

달리 말하면, 가상머신은 기존의 OS 공간에 새로운 OS를 통째로 만드는 것이고
Docker는 OS의 권한을 이용해서 기존 OS의 공간을 나누는 것이다.

공통되는 부분은 Host OS의 것을 같이 사용하고, 따로 필요한 부분에 별도의 공간을 할당한다고 볼 수 있다.

잠겨있는 고래 = Host OS / 컨테이너 = 프로세스

그리고 Docker에는 이미지(Image)라는 중요한 개념이 있는데, 컨테이너는 하나 이상의 이미지를 실행한 상태라고 보면 된다.

이미지는 컨테이너 생성 및 실행에 필요한 모든 파일과 설정(환경)값 등을 포함하고 있는 파일이다. 이 덕분에 우리는 새로운 서버를 셋팅할 때 마다 Linux, MySQL, Java 등을 다시 설치할 필요가 없다. 추가되거나 변하는 값은 컨테이너에 저장되지만 이미지는 변하지 않는다(Immutable).

 

Windows 10 Home 환경에서 Docker 설치

Windows에서 Docker는 Hyper-V 혹은, WSL2 기반으로 사용 가능하다.

. Hyper-V : Windows가 제공하는 가상화 솔루션으로, 가상화된 컴퓨팅 환경을 만들고 관리하는 인프라를 제공

. WSL2 : Windows Subsystem for Linux 2의 줄임말로 윈도우에서 리눅스를 사용할 수 있게 해주는 기능

 

이 중 Hyper-V는 Window 10 Pro, Education 64-bit 버전에서 사용할 수 있다. ( Home 에디션에서는 지원하지 않음 )

필자는 Windows 10 Home 에디션이기 때문에 아래와 같이 WSL2를 설치하고 활성화했다.

 

WSL2 설치 및 활성화

1) Windows Terminal을 '관리자 권한으로 실행' 후 아래 두 명령어 실행

  $ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

  $ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

2) 윈도우 재부팅 
3) x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지 다운
4) Windows Terminal을 열고 다음 명령어 실행

  $ wsl --set-default-version 2

 

Docker Desktop 다운로드 및 설치 방법

 

1) 아래 링크에서 'Download for Windows'를 클릭해 Intaller다운 및 Docker 설치

 

Docker Desktop for Mac and Windows | Docker

Learn why Docker Desktop is the preferred choice for millions of developers building containerized applications. Download for Mac or Windows.

www.docker.com

2) WSL2 설정 확인

General - Use the WSL 2 based engine 체크 확인
Resources - WSL INTEGRATION - Enable integration with my default WSL distro 체크 확인

 

3) 위 항목이 체크되어 있지 않으면, 체크한 후 Apply & Restart 버튼을 눌러 Docker 재실행

+ Recent posts