728x90
반응형

spring

Spring Framework의 특징 세 가지중 하나인 AOP를 알아볼 것이다.

Spring삼각형

1. AOP

: 관점지향프로그래밍(Aspect Oriented Programming)이다. 쉽게 말해서 관점을 나눠서 프로그래밍 하겠다는 건데, 특정 로직을 비즈니스적인 관점과 부가적인 관점으로 나눠서 나눈 관점 기준으로 모듈화하여 프로그래밍하는 것이다.

AOP

예를 들면, 비즈니스적인 관점이라 하면 말그대로 우리가 구현하고자 하는 서비스의 핵심적인 로직부분을 가리키는 관점이고, 부가적인 관점은 해당 로직이 없어도 비즈니스에 아무런 영향이 없는 부분을 가리키는 DB연결로직이나 로깅 등을 가리키는 관점이다.

그리고 각 로직마다 반복되는 부분을 흩어진 관심사(Crosscutting Concerns)라고 하는데, AOP에서는 이러한 부분을 위에서 언급한 관점지향적으로 모듈화하여 프로그래밍할 것이다.

2. AOP의 사례

AOP의 대표적인 2가지 사례를 알아볼 것이다.

A. logging

: 로깅(logging) 기능은 로직마다 반복적이고 공통적으로 활용되는 대표적인 부가기능 중 하나이다. 이러한 로깅기능을 AOP를 활용하여 프로그래밍 한다면 아래와 같이 코딩할 수 있다.

  • ParameterAop.java
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class ParameterAop {

    @Pointcut("execution(* com.example.aop.controller..*.*(..))")
    private void cut(){}

    @Before("cut()")
    public void before(JoinPoint joinPoint){
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        System.out.println(method.getName());
        Object[] args = joinPoint.getArgs();
        for(Object obj : args){
            System.out.println("type : "+obj.getClass().getSimpleName());
            System.out.println("value : "+obj);
        }
    }

    @AfterReturning(value = "cut()", returning = "returnObj")
    public void afterReturn(JoinPoint joinPoint, Object returnObj){
        System.out.println("return obj");
        System.out.println(returnObj);
    }
}
  • RestApiController.java
import com.example.aop.annotation.Decode;
import com.example.aop.annotation.Timer;
import com.example.aop.dto.User;
import org.springframework.util.StopWatch;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class RestApiController {

    @GetMapping("/get/{id}")
    public String get(@PathVariable Long id, @RequestParam String name){
        // TODO

        return id+ " "+ name;
    }

    @PostMapping("/post")
    public User post(@RequestBody User user){


        return user;
    }

}

ParameterAop.java파일에서 AOP로 모듈화할 클래스를 정의하였다.
AOP로 모듈화하기 위해서는 클래스명에 @Aspect어노테이션을 명시해주어야 한다.
@PointCut어노테이션은 모듈화된 클래스가 적용될 클래스의 경로를 지정해준다.
지정된 경로의 클래스의 메소드가 실행될 때마다 AOP로 정의된 클래스의 메소드가 실행될 것이다.
위의 코드에서 cut()메소드는 @PointCut으로 적용된 클래스의 메소드인 RestApiController.get()RestApiController.post()를 가리키게 된다.

@Before어노테이션은 지정된 메소드가 실행되기 바로 이전에 실행될 메소드에 명시된다. 해당 어노테이션에 지정된 메소드는 cut()메소드이다.
위 코드에서 before()메소드의 파라미터로 받는 JoinPointcut()메소드에서 정보를 가져올 때 활용되는 객체이다.
위 코드에서 JoinPoint객체는 HTTP 메소드와 cut()메소드에서 활용된 파라미터 값을 가져오기 위해서 활용되고 있다.

@AfterReturning어노테이션은 @Before어노테이션과 반대로 지정된 메소드가 실행된 후 바로 실행될 메소드에 명시된다. 해당 어노테이션에 지정된 메소드 역시 cut()메소드이다.
그리고 @AfterReturning어노테이션에서 returning값을 지정해주면 cut()메소드에서 반환된 값이 returning값으로 지정된 변수에 입력되어 활용할 수 있다. 위 코드에서는 returnObj변수에 활용되고 있다.

위 사례의 코드와 같이 프로그래밍을 한다면, 특정 비즈니스 로직이 실행되기 전후에 로깅기능을 모듈화하여 사용할 수 있다.

B. Timer

: 타이머(Timer)기능은 특정 로직의 실행시간을 확인시켜주는 기능이다. 이 또한 비즈니스로직과 관련이 없는 기능이기 때문에 아래와 같이 AOP로 모듈화할 수 있다.

  • TimerAop.java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

@Aspect
@Component
public class TimerAop {

    @Pointcut("execution(* com.example.aop.controller..*.*(..))")
    private void cut(){}

    @Pointcut("@annotation(com.example.aop.annotation.Timer)")
    private void enableTimer(){}

    @Around("cut() && enableTimer()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        Object result = joinPoint.proceed();

        stopWatch.stop();
        System.out.println("total time : "+stopWatch.getTotalTimeSeconds());
    }
}
  • Timer.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Timer {
}
  • RestApiController.java
import com.example.aop.annotation.Decode;
import com.example.aop.annotation.Timer;
import com.example.aop.dto.User;
import org.springframework.util.StopWatch;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class RestApiController {

    @Timer
    @DeleteMapping("/delete")
    public void delete() throws InterruptedException {

        // db logic
        Thread.sleep(1000 * 2);

    }

}

Timer 기능도 역시 로깅 기능을 구현할 때와 마찬가지로 AOP를 활용하여 모듈화시켰고 코드상의 차이도 크게 없다.
하지만 두 가지정도 차이나는 부분이 있는데, 해당부분만 언급해보겠다.

첫 번째 차이는 로깅 기능을 구현할 때에는 경로 지정방식으로 @PointCut어노테이션에 해당 기능이 활용될 클래스의 경로를 지정하였는데,
Timer 기능을 구현할 때에는 @PointCut어노테이션에 특정 어노테이션을 지정하여, 지정된 어노테이션이 붙은 클래스나 메소드가 실행될 때에만 Timer기능이 실행될 수 있도록 하였다.
이를 위해 Timer라는 별도의 인터페이스를 Timer.java와 같이 작성하였다.
여기서 @Target어노테이션은 임의로 선언된 어노테이션인 @Timer어노테이션이 붙을 수 있는 타입을 지정하는 어노테이션이다.
위 코드에서는 메소드와 클래스에 붙을 수 있도록 지정하였다.
그리고 @Retention어노테이션은 임의로 선언된 어노테이션인 @Timer어노테이션의 생명주기(Life Cycle)을 지정하는 어노테이션이다.
위 코드에서는 런타임으로 생명주기를 지정하였고, 실행될 동안에는 계속 유효한 어노테이션으로 사실상 안죽는 어노테이션이라는 말이다.

두 번째 차이는 로깅 기능을 구현할 때에는 @Before어노테이션과 @AfterReturning어노테이션을 활용하여 실행시점과 동작을 정의하였는데,
타이머 기능을 구현할 때에는 @Around어노테이션을 활용하여 비즈니스로직의 전후를 하나의 메소드에서 정의할 수 있도록 하였다.
이를 활용한 이유는 타이머 기능같은 경우는 시간데이터를 비즈니스로직이 실행되기 전후에 공유되어야 하는데, before/after로 메소드가 나뉘어 실행될 경우 시간데이터가 공유될 수 없기 때문이다.
@Around어노테이션도 마찬가지로 타겟 메소드를 지정하여 특정 로직이 실행될 때마다 실행될 수 있도록 설정할 수 있다.
그리고 before/after 어노테이션을 활용할 때와 다른점은 비즈니스 로직을 감싸는 형태로 메소드가 실행된다는 점이다.
TimerAop.javaaround()메소드를 보면, joinPoint.proceed()로 비즈니스 로직이 실행되는 부분이 있고,
전후로 stopWatch.start()stopWatch.stop()이 실행시켜서 전후에 어떤 메소드가 실행될지 프로그래밍 하였다.
그리고 stopWatch객체를 활용하여 비즈니스 로직의 시작시간과 끝나는시간을 기록하였고, stopWatch.getTotalTimeSeconds()메소드를 통해 기록된 시간의 차이를 알 수 있다.

마무리

: 위 두 사례에서 본 것과 같이 AOP는 비즈니스 관점과 부가적인 관점을 나누어 비즈니스 로직과 부가적인 로직을 분리시켜주는 프로그래밍 방식이다.
@Aspect가 명시된 클래스에서 부가 기능들이 비즈니스 로직의 어떤 시점에 실행되고 어떤 방식으로 실행되는지, 어떤 타겟에서 실행되는지 설정할 수 있고, 이를통해 부가 기능을 철처하게 모듈화시킬 수 있다.

이어서

기존 계획은 AOP를 알아본 이후에 PSA도 함께 알아보려 했으나, DB와 같이 보는 것이 좋을 것 같아서 후순위로 조금 미루려한다.
대신 이어서 SOAP를 알아보려 한다. 요즘은 REST연동 방식이 대세라곤 하지만, 레거시한 시스템에서는 아직 많이 활용되는 방식이라 알아두면 좋을 것 같고, 실제로 나는 로그인 연동기능을 구현할 때, SOAP때문에 많이 애먹었어서 해당 부분을 까먹기전에 다뤄보려한다.

다음은 SOAP을 알아보자!

반응형
728x90
반응형

1. Regression 이란?

: 학습데이터를 기반으로 넓은 범위의 데이터 중 하나를 추정하는 방식이다. 머신러닝의 Supervised-learning 유형 중 하나이다.

위 예시는 Predicting exam score 문제이고 Regression의 대표적인 예시이다.
그리고 테이블의 데이터는 학습데이터이고, 그 중 y컬럼의 데이터는 x컬럼 데이터에 대한 추정치로 출력되는 label데이터이다.

2. Linear Regression

: 입력데이터에 따라 출력데이터가 선형적으로 출력되는 Regression

null

공부한시간에 비례하여 시험성적이 높게 나오는 Predicting exam score 예시처럼
인풋값에 따라 어느정도 규칙성을 가지고 선형적으로 변하는 학습데이터 training-sets을 갖는다.
그리고 training-sets를 인풋값 x, 출력값 y로 설정하여 Hypothesis를 사진 속 H(x)와 같이 추정할 수 있다.

인풋값에 따라 출력값을 최대한 유사하게 추정하려면, 주어진 training-sets에 따른 정확한 Hypothesis가 정해져야 한다.

3. Cost function

null

cost functiontraining-setsHypothesis의 유사도를 측정하기 위해 활용되는 함수이다.
(H(x) : Hypothesis에 대한 출력값, y : 실제 출력값)
해당 함수를 통해 주어진 training-sets에 대한 정확한 Hypothesis를 구할 수 있다.

계산 방법은 위 사진처럼 임의의 Hypothesis를 정해놓고, 각 training-sets과의 차이를 계산하면 된다.
그리고 계산된 차이가 가장 적은 Hypothesis가 최적의 Hypothesis가 되는 원리이다.

이 때, 각 training-sets에 대해 계산된 차이는 음수가 되면 안된다.
이를 방지하기 위해 각 training-sets에 대해 계산된 차이를 제곱하여 차곡차곡 더한다.

null

위 사진은 임의의 Hypothesis에 대한 cost를 구하기 위한 수식을 나타낸다.
그리고 training-sets 데이터이 갯수가 3개라고 가정하였다.
각 데이터에 대해 계산된 차이를 제곱하고 더하여 데이터의 갯수인 3만큼 나누면 cost가 구해진다.

null

결론적으로 cost function은 위 사진의 수식처럼 W, b에 대한 수식처럼 나타낼 수 있다.
그리고 위 수식대로 계산된 cost값 중 최소 cost값을 찾는 과정이 Linear Regression에서의 학습이다.

이어서

TensorFlow에서의 Linear Regression구현에 대해 알아볼 것이다.
그리고 이전에 TensorFlow활용법에 대해 간단하게 살펴볼 것이다.

반응형

'개발 > AI' 카테고리의 다른 글

[AI] Softmax Regression  (0) 2023.10.01
[NLP] Embedding  (0) 2023.09.23
[AI] Logistic Regression  (0) 2023.09.10
[AI] Machine Learning (머신러닝) - 개념  (0) 2023.01.18
[AI] 서론  (3) 2023.01.18
728x90
반응형

https://youtu.be/qPMeuL2LIqY
위 링크의 유튜브 강의를 수강하여 정리하였다.

1. 머신러닝이란?

  • 머신러닝은 기계가 특정 데이터를 입력으로 받아 학습하고, 학습된 데이터를 기반으로 판단하는 기술이다.

머신러닝은 training-sets(학습데이터)에 따라 다음과 같은 두 부류로 나뉜다.

  1. Supervised learning : 특정 label을 가리키고 있는 데이터들을 학습시키는 머신러닝

    (ex. Image labeling, Email spam filter, Predicting exam score etc.)
  2. Unsupervised learning : 특정 label을 가리키지 않지만, 유사한 데이터들끼리 그룹핑시켜주는 머신러닝

나는 강의를 따라서 Supervised learning만 다룰 것이다.

2. Supervised learning



머신러닝의 기본 컨셉은 위 사진과 같다.
ML으로 명명되어 있는 시스템 옆의 trainig-sets 데이터를 학습시킨다.
Supervised learning의 경우, trainig-sets 데이터는 일반적으로 x, y 형태로 labeling이 되어있다.(y : label)
그리고 학습이 완료되어 학습된 머신러닝에 training-sets x 데이터 형태로 입력할 경우,
머신러닝은 학습된 데이터를 기반으로 라벨(y)를 추정하여 출력시켜준다.

이에 대한 예시가 알파고이다.
알파고는 training-sets인 대량의 바둑경기 데이터를 학습받았고, 학습받은 바둑경기 데이터를 토대로하여 그 다음 최적의 수(y)를 판단하여 놓을 수 있다.

3. Types of supervised learning

A. Regression

: 학습 데이터를 기반으로 넓은 범위의 데이터중 하나를 추정하여 출력하는 방식이다. (ex. Predicting final exam score(범위 : 0~100))

B. Binary classification

: 두 가지 케이스로 나누어서 학습 데이터를 기반으로 입력데이터가 두 가지 케이스중 어떤 케이스인지 추정하는 방식이다.

C. Multi-label classification

: 세 가지 이상의 케이스로 나누어서 학습 데이터를 기반으로 입력데이터가 많은 케이스중 어떤 케이스인지 추정하는 방식이다.

앞으로 위 세 가지 유형을 하나씩 살펴볼 것이다.

반응형

'개발 > AI' 카테고리의 다른 글

[AI] Softmax Regression  (0) 2023.10.01
[NLP] Embedding  (0) 2023.09.23
[AI] Logistic Regression  (0) 2023.09.10
[AI] Regression  (0) 2023.01.22
[AI] 서론  (3) 2023.01.18
728x90
반응형

최근에 우리회사 팀 내에서 오프라인으로 워크샵을 진행했다.
팀장님은 팀내 현황을 브리핑하였고, 오픈사업을 더 추진해야한다고 하여 신사업분야에 대한 브레인스토밍을 위해 워크샵을 진행했다고 한다.
우리 팀은 세 개조로 나뉘었고, 각 조에서 우리팀에서 어떤 새로운 사업을 하면 좋을지에 대해 아이디어 회의를 진행했다.

아무리 짱구를 굴려봐도... 마땅한 아이템이 생각나지 않았다.
처음은 SWOT분석으로 시작해봤다.
우리 팀의 강점이 뭐고, 위협요소는 무엇인지, 유망한 분야는 어떤 것이 있는지...
우리 팀은 kt에 종속된 시스템을 개발하고 운영하는 부서이기 때문에 강점을 살릴만한 분야를 찾기가 쉽지 않았다.
SWOT분석을 배제한다해도 순수 아이디어를 생각해내기가 쉽지 않았다.
시장에 나온 아이디어들이 너무나도 많았다. 평범하게 생각해서는... 새로운 사업분야를 찾기가 쉽지 않다는 것을 깨달았다.
새로운 블루오션을 찾아야한다고 느꼈다.

패러다임이 바뀌었다.
단순히 개발언어와 프레임워크만 가지고 플랫폼 사업을 기획하는 시대는 지났다. 너무 레드오션이다.
시장에 나온 플랫폼들이 너무 많다. 붕어빵 가게와 같은 노점위치를 공유하는 앱도 있더라...

가트너


이제는 신기술을 적용해야 한다.
신기술이라함은 CES와 같은 전시회에서 쉽게 찾아볼 수 있고, 가트너가 당해 주목하고 있는 기술들 AI, 메타버스 등등
이런 신기술들을 활용한다면 고려할 수 있는 신사업영역이 다양해질 것이라고 생각하고, 숨은 블루오션을 찾을 수 있을 것이라 생각한다.
나는 하나씩 살펴보기로 했다.

나는 첫번째로 AI에 초점을 두기로 했다.
AI 입문이라는 검색어로 구글링을 통해 들어가게된 블로그
https://velog.io/@djm0727/AI-introduction
위 블로그를 통해 AI 공부를 위해서는 다양한 정보를 접하는 것이 중요하다는 것을 알게되었고,
추천해준 링크 하나씩 참고하여 AI공부를 시작하고자 한다.
그리고 나는 먼저 유튜브 강의 하나를 수강하기 시작했다.
강의 제목은 '모두를 위한 딥러닝 강좌'

거두절미하고 일단 시작해보자

반응형

'개발 > AI' 카테고리의 다른 글

[AI] Softmax Regression  (0) 2023.10.01
[NLP] Embedding  (0) 2023.09.23
[AI] Logistic Regression  (0) 2023.09.10
[AI] Regression  (0) 2023.01.22
[AI] Machine Learning (머신러닝) - 개념  (0) 2023.01.18

+ Recent posts