Spring 프레임워크 활용(2)

Hyunsoo Kim·2024년 5월 8일
0

스프링

목록 보기
2/13
post-thumbnail
post-custom-banner

KOTRA 강의를 기반으로 작성된 문서입니다.

MARIA DB 연결 아키텍처

1. DB-JDBC 연결

value.properties

db.driverClass=org.mariadb.jdbc.Driver
db.url=jdbc:mariadb://127.0.0.1:3306/spring_db?useUnicode=true&charaterEncoding=utf-8&useSSL=false&serverTimezone=UTC
db.username=(아이디)
db.password=(비밀번호)

spring_beans.xml

	<!-- values.properties \uD30C\uC77C \uC704\uCE58 \uC124\uC815 -->
	<context:property-placeholder location="classpath:values.properties"/>
	
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" 
		p:driverClassName="${db.driverClass}"
		p:jdbcUrl="${db.url}"
		p:username="${db.username}"
		p:password="${db.password}"
	/>

2. mybatis 의존성 주입(maven)

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.16</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>3.0.3</version>
		</dependency>

- MyBatis 데이터 액세스 계층


my batis 공식 문서

3. Mapper 통한 데이터 연결

  • mapper 인터페이스는 mapping 파일에 기재된 SQL을 호출하기 위한 인터페이스
UserMapper.xml

<select id="selectUserById" parameterType="string" resultType="User">
		select * from users where userid=#{value}
	</select>

UserMapper.java

public interface UserMapper {
	UserVO selectUserById(String id);
}

AOP

1. 개념과 용어

  • 관심사의 분리(기능의 분리). 즉, 핵심적인 기능에서 부가적인 기능을 분리한다.
  • 분리한 부가기능을 Aspect라는 독특한 모듈 형태로 만들어서 설계하고 개발하는 방법이다.

- Aspect

  • 부가기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지를 결정하는 포인트컷(PointCut)을 합친 개념이다.
  • 싱글톤 형태의 객체로 존재한다.
  • 예를 들어, 애플리케이션의 모든 메서드 실행 시간을 측정하고 싶다고 가정하자. 이를 위해 Aspect를 사용하여 모든 메서드 실행 시간을 측정하는 기능을 추가할 수 있다. Aspect를 사용하면 모든 메서드에 기능을 추가할 필요 없이, Aspect를 통해 자동으로 추가할 수 있다.

cf) 포인트컷: 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.

2. 구현

<!-- AOP 설정 시작 -->
		<aop:config>
		<aop:aspect id="traceAspect" ref="performanceTraceAdvice">
			<aop:around pointcut="execution(public * myspring.user..*(..))"
				method="trace" />
		</aop:aspect>
	</aop:config>

	<!-- Advice 클래스를 Bean으로 등록 -->
	<bean id="performanceTraceAdvice" class="myspring.aop.xml.PerformanceTraceAdvice" />
	
	<!-- AOP 설정 끝-->

public class PerformanceTraceAdvice {
	public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
		String targetName = joinPoint.getTarget().getClass().getName();
		System.out.println(targetName + "객체 시작");
		
		//타겟 메서드의 signature 정보
		String signatureString = joinPoint.getSignature().toShortString();		
		System.out.println(signatureString + " 시작");
		
		//타겟 메서드의 아규먼트 정보
		for(Object arg: joinPoint.getArgs()) {
		System.out.println(signatureString + " 메서드의 아규먼트 값 " + arg);
		}
		
		
		//타겟의 메서드가 호출되기 전의 시간 
		long start = System.currentTimeMillis();		
		try {
			//new Object[] {new String("dooly")}
			//타겟의 메서드 호출
			Object result = joinPoint.proceed();
			return result;
		} finally {
			//타겟의 메서드가 호출된 후의 시간
			long finish = System.currentTimeMillis();
			System.out.println(signatureString + " 메서드 종료");
			System.out.println(signatureString + " 메서드의 실행 시간 : " + 
			   (finish - start) + " ms");
		}
	}
}

참고자료
1) 람다식 공부 소스링크
2) 스프링 in action 공식 문서
2-1) 스프링 in action 소스링크

profile
다부진 미래를 만들어가는 개발자
post-custom-banner

0개의 댓글