유쨈미 2024. 7. 9. 17:47

1. AOP를 활용한 로그인 구현

AOP (Aspect-Oriented Programming)는 횡단 관심사를 분리하여 모듈성을 높이는 프로그래밍 기법이다.
로그인 기능을 구현할 때 AOP를 사용하면, 핵심 비즈니스 로직과 인증 로직을 분리할 수 있다.

어노테이션/메소드 설명
@Aspect 해당 클래스가 Aspect임을 선언
@Around 대상 메소드 실행 전후에 로직 추가
ProceedingJoinPoint.proceed() 원래 메소드 실행

 

💻 예시 코드

@Aspect
@Component
public class LoginAspect {
	@Around("execution(* com.example.service.*.*(..))")
    public Object loginCheck(ProceedingJoinPoint joinPoint) throws Throwable {
    // 로그인 체크 로직
    if(isLoggedIn()) {
    	return joinPoint.proceed();
    }else {
    	throw new UnauthorizedException("로그인이 필요합니다.");
    }
  }
}

2. @Aspect@Around의 개념 및 활용

💡 @Aspect 개념 및 활용

@Aspect는 Spring AOP에서 관점(Aspect)을 정의하는 데 사용되는 어노테이션이다.

 

💡 @Aspect 개념

  1. 횡단 관심사(Cross-Cutting Concern)를 모듈화 한 클래스를 나타낸다.
  2. 로깅, 트랜잭션 관리, 보안 등 여러 객체에 공통적으로 적용되는 기능을 정의할 때 사용한다.

 

💡 @Aspect 활용

  1. 클래스 레벨에 적용하여 해당 클래스가 Aspect임을 선언한다.
  2. Spring의 자동 프록시 생성 기능과 함께 사용되어 AOP를 구현한다.
관련 어노테이션 설명
@Aspect 해당 클래스가 Aspect임을 선언
@Component Aspect를 Spring 빈으로 등록

 

💻 예시 코드

@Aspect
@Component
public class LogginAspect {
	// Advice 메소드들이 여기에 정의된다.
}

 

💡 @Around 개념 및 활용

@Around는 Spring AOP에서 가장 강력한 Advice 유형 중 하나로, 메소드 실행의 전, 후, 예외 발생 시
모든 시점에 로직을 추가할 수 있다.

 

💡 @Around 개념

  1. 대상 메소드 실행의 완전한 제어권을 갖는다.
  2. 메소드 실행 전후에 로직을 추가하거나, 메소드 실행 자체를 건너뛸 수 있다.

💡 @Around 활용

  1. 메소드 레벨에 적용하여 Advice를 정의한다.
  2. ProceedingJoinPoint를 파라미터로 받아 원본 메소드의 실행을 제어한다.
주요 메소드/개념 설명
ProceedingJoinPoint 원본 메소드의 실행을 제어하는 객체
proceed() 원본 메소드를 실행
getSignature() 실행 중인 메소드의 시그니처 정보를 얻음

 

💻 예시 코드

@Aspect
@Component
public class PerformanceAspect {
    
    @Around("execution(* com.example.service.*.*(..))")
    public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        
        Object result = joinPoint.proceed(); // 원본 메소드 실행
        
        long executionTime = System.currentTimeMillis() - start;
        
        System.out.println(joinPoint.getSignature() + " 실행 시간 : " + executionTime + "ms");
        
        return result;
    }
}

3. Spring과 JDBC를 이용한 DB연동

Spring은 JDBC를 추상화하여 데이터베이스 연동을 쉽게 만든다.

JdbcTemplate 클래스를 사용하면 반복적인 코드를 줄일 수 있다.

클래스/메소드 설명
JdbcTemplate JDBC 작업을 잔순화하는 핵심 클래스
query() SELECT 쿼리 실행
update() INSERT, UPDATE, DELETE 쿼리 실행

 

💻 예시 코드

@Repository
public class UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public User findById(Long id) {
        return jdbcTemplate.queryForObject(
            "SELECT * FROM users WHERE id = ?",
            new Object[]{id},
            (rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name"))
        );
    }
}

4. 컴포넌트스캔과 어노테이션

Spring은 어노테이션을 통해 빈을 자동으로 등록하고 의존성을 주입한다.

어노테이션 설명
@Component 일반적인 스프링 관리 컴포넌트
@Service 비즈니스 로직을 담당하는 컴포넌트
@Repository 데이터 접근 계층 컴포넌트
@Autowired 의존성 자동 주입

5. ApplicationContext 활용

ApplicationContext은 Spring IoC컨테이너의 인터페이스로, 빈의 생성과 관리를 담당한다.

메소드 설명
getBean() 컨테이너에서 빈을 가져옴
getBeansOfType() 특정 타입의 모든 빈을 가져옴

 

💻 예시 코드

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean(UserService.class);

6. Spring 핵심 개념 요약정리

  1. 의존성 주입 DI
    객체 간의 의존관계를 외부에서 설정한다.
  2. 제어의 역전 IoC
    객체의 생명주기 관리를 프레임워크가 담당한다.
  3. AOP (Aspect-Oriented Programming)
    횡단 관심사를 분리하여 모듈성을 향상시킨다.
  4. PSA (Portable Service Abstraction)
    환경과 세부기술에 독립적인 추상화 계층을 제공한다.