// VO class
public class NaverProfileVO {
private String resultcode;
private String message;
private InnerNaverProfileVO response;
public class InnerNaverProfileVO{
private String email;
private String nickname;
private String profile_image;
private String age;
private String gender;
private String id;
private String name;
private String birthday;
private String birthyear;
private String mobile;
}
}
getter/setter
// vo 객체 안에 value 값을 담는 메서드
NaverProfileVO vo = new NaverProfileVO();
ObjectMapper mapper = new ObjectMapper();
vo = mapper.readValue(jason문자열, NaverProfileVO.class);
이렇게 하면 NaverProfileVO 객체 안에 값이 다 담긴다.
그러나 네이버 뿐만 아니라 카카오와 구글 로그인 api도 구현하려고 하다 보니
세 가지를 통합해서 vo를 생성하기 때문에 중복된 변수들이 있어 첫 번째 방법은 사용하기 힘들다.
Spring Bean Configuration File을 통해 만든 xml의 context:component-scan 태그
- Namespaces에서 context를 체크한다.
<context:component-scan base-package="패키지이름"/>
xml의 context:component-scan 태그 base-package 속성에 패키지 이름을 적어 넣으면
해당 패키지 안에 있는 클래스를 로드하여 @Component 어노테이션에 있는 클래스를 Bean에 등록한다.
@Component 어노테이션의 경우 클래스에 필드가 없는 경우 사용한다.
@Configuration
자바 클래스를 설정으로 이용할 수 있다. 클래스 상단에 어노테이션을 적용한다.
클래스 안의 메서드를 @Bean 어노테이션으로 Bean으로 등록하고 메서드명은 xml 설정의 id와 같다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationContext {
@Bean
public A methodA() {
A a = new A();
a.setName("이병건");
a.setValue("나이: 41");
return a;
}
@Bean
public B methodB() {
B b = new B();
b.setName("BBB");
b.setA(methodA()); // setter 주입
return b;
}
}
AOP (Aspect Oriented Programming 관점지향)
트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능을 해당 기능을 분리하여 관리할 수 있다.
Spring Bean Configuration File의 Namespaces에서 aop를 체크한다.
용어
Aspect : 공통의 관심사들로 이루어진 모듈
ex) 로그에 관련된 모듈을 모아둔 클래스/ 메서드 하나가 모듈 하나로 생각하면 된다.
Target : 공통 모듈(Aspect)이 적용될 곳 (클래스 또는 메서드)
Advice : 실제 적용될 공통 모듈 하나를 의미
Joinpoint : advice가 적용되어야 하는 시점
Pointcut : target이 상세화 된 것
<context:component-scan base-package="aopEx01"/>
<bean id="LoggerAOP01" class="aopEx01.Aspect01"/>
<aop:config>
<aop:aspect id="Logger01" ref="LoggerAOP01"> <!-- 참조할 Bean -->
<!-- expression으로 적용될 곳을 지정 (aopEx01 패키지의 A 클래스) -->
<aop:pointcut expression="within(aopEx01.A)" id="pointcutA"/>
<aop:pointcut expression="within(aopEx01.B)" id="PointcutB"/>
<aop:pointcut expression="within(aopEx01.C)" id="PointcutC"/>
<!-- 상단에 pointcutA로 지정한 aopEx01 패키지 A 클래스의
loggerAop01 메서드를 around로 지정 -->
<aop:around method="loggerAop01" pointcut-ref="pointcutA"/>
<aop:before method="loggerAop02" pointcut-ref="PointcutB"/>
<!-- 오류가 나더라도 무조건 호출되는 모듈 aop:after -->
<aop:after method="loggerAop03" pointcut-ref="PointcutC"/>
<!-- 핵심 로직이 정상 종료 되었을 때 호출되는 공통 모듈 -->
<aop:after-returning method="loggerAop03" pointcut-ref="PointcutC"/>
<!-- 핵심 로직이 오류가 발생하여 종료가 되었을 때 호출되는 공통모듈 -->
<aop:after-throwing method="loggerAop03" pointcut-ref="PointcutC"/>
</aop:aspect>
</aop:config>