// 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를 생성하기 때문에 중복된 변수들이 있어 첫 번째 방법은 사용하기 힘들다.
왼쪽에 line charts를 눌러주시고 Code it yourself on JSPFiddle을 누르면
예제 코드를 볼 수 있고 데이터도 바꾸면서 확인할 수 있습니다.
html의 script를 본인 html head태그 안에 넣어주시고
div 태그는 그래프가 그려질 장소이니 그래프를 보여줄 곳에 넣어주면 됩니다.
google.charts.load('current', {packages: ['corechart', 'line']});
google.charts.setOnLoadCallback(drawchart);
function drawchart() {
var data = new google.visualization.DataTable();
data.addColumn('number', 'X');
data.addColumn('number', 'Dogs');
data.addRows([ ]);
var options = { };
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
구글 차트의 기본적인 구조입니다.
차트를 로드하고 .setOnLoadCallback(); 함수로 html이 전부 로드된 후 매개변수에 들어간 함수를 호출합니다.
data 변수에 데이터 테이블을 생성하고 .addColumn으로 열을 추가합니다
열의 데이터 타입은 많이 있으니 직접 검색해보시면 됩니다.
.addRows는 만들어진 열에 데이터를 추가하는 것으로 배열 형식으로 추가할 수 있습니다.
options는 그래프의 옵션을 정하는 변수로 x축, y축, 그래프 사이즈 등 여러 옵션을 설정할 수 있습니다.
chart에 그래프가 그려질 곳을 설정하고 .draw로 데이터와 옵션을 추가해 그립니다.
저는 oracle db에 있는 데이터를 받아와 출력할 생각이기 때문에 .addRow만 좀 다르게 해 주면 됩니다.한 번에 그리는 방법도 있을 수 있는데 저는 제 실력이 부족해서 한번에 데이터를 받아와 그리는 것을 못했습니다.그래서 html이 전부 그려지고 빈 차트를 그린 후에 거기에 데이터를 추가하는 방법을 선택했습니다.
google.charts.load('current', {packages: ['corechart', 'line'], callback: drawBasic});
google.charts.setOnLoadCallback(addData);
var data;
var chart;
var options;
function drawBasic() {
data = new google.visualization.DataTable();
data.addColumn('datetime', 'year');
data.addColumn('number', 'Property');
data.addRows([
]);
options = {
width:'100%'
}
chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
먼저 빈 차트를 그리는 코드입니다.
변수를 두 번째에 그릴 때도 사용할 것이기 때문에 함수 밖에 변수를 설정해줍니다.
저는 x축을 날짜별로 보여줄 거라 데이터 타입을 datetime으로 설정했습니다.
data 행은 두 번째 그릴 때 추가할 거라 빈 값으로 설정해주고 그려주면 끝납니다.
var year = [];
var month = [];
var day = [];
var value = [];
<%for(GraphVO gv : glist){%>
year.push(<%=gv.getYear()%>);
month.push(<%=gv.getMonth()%>);
day.push(<%=gv.getDay()%>);
value.push(<%=gv.getMoney()%>);
<% }%>
var len = year.length;
function addData(){
var arr = new Array();
for(let i = 0; i<len; i++){
arr = [new Date(year[i],month[i]-1,day[i]),value[i]];
data.addRow(arr);
}
options = {
pointSize: 5,
width:'100%',
hAxis: {
title: 'Time',
format:'yy-MM',
ticks: [new Date(year[0],month[0]-1,day[0]),new Date(year[len-1],month[len-1]-1,day[len-1])]
},
explorer: { axis: 'horizontal' }
};
chart.draw(data, options);
}
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>