[Spring Boot] Rest API / AOP

KDH59·2024년 5월 23일

[SPRING BOOT]

목록 보기
2/7

Rest API

  • 웹 상에서 URL 을 통해 원하는 정보를 얻어오거나 특정한 요청을 하는 것을 우리는 REST API 라고 한다.
  • 여기에는 사용 설명서도 포함이 된다.

<script> 
listCall();

function listCall(){
    $.ajax({
        type: 'GET',
        url: './getTeamList.ajax',
        dataType: 'json',
        success: function(data) {
            var content = '';
            data.list.forEach(function(item){
                // class 안에 팀 이름과 컬럼명 정보를 담는다.
                content = '<tr>';
                content += '<td>'+item.team_name+'</td>';
                content += '<td><input type="text" class="'+item.team_name+' project_name" value="'+item.project_name+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' team_leader" value="'+item.team_leader+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' staff1" value="'+item.staff1+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' staff2" value="'+item.staff2+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' staff3" value="'+item.staff3+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' staff4" value="'+item.staff4+'"/></td>';
                content += '<td><input type="text" class="'+item.team_name+' staff5" value="'+item.staff5+'"/></td>';
                content += '</tr>';
                $('#list').append(content);
            });
            □ 항상 요소가 출력되고 나서 이벤트를 걸어줄 것!
            $('input[type="text"]').focusin(function(){
                $(this).css({"background-color":"white"});
            });

            $('input[type="text"]').focusout(function(e){this : 이벤트를 당한 당사자 객체
                □ e : 이벤트 그 자체
                $(this).css({"background-color":"lightgray"});
                □console.log(e.target.defaultValue,' -> ',e.target.value);
                if(e.target.defaultValue != e.target.value){
                    console.log('서버에 변경 요청',e);팀이름(PK), 변경할 컬럼, 변경할 값
                    □ UPDATE team_project SET project_name = '강아지몰' WHERE team_name = '1조';UPDATE team_project SET team_leader = '김영수' WHERE team_name = '3조';
                    □ column, value, pk
                    reqUdate(e.target.classList[1],e.target.value,e.target.classList[0]);
                }	    		
            });	    	
        },
        error: function(e) {
            console.log(e);
        }
    });	
}

function reqUdate(col,val,pk){
    console.log('UPDATE team_project SET '+col+' = '+val+' WHERE team_name = '+pk);
    □ 서버에 데이터를 보내는 방법
    □ 1. 파라메터 형식 update?col=project_name&val=김영수&pk=3조
    □ 2. url 방식 update/project_name/김영수/3조
    $.ajax({
        type:'PUT',
        url:'update/'+col+'/'+val+'/'+pk,
        data:{},
        dataType:'JSON',
        success:function(data){ 
            console.log(data);
            if(data.success==0){
                location.reload();
            }
        },
        error:function(e){ 
            console.log(e);	
            location.reload();
        }
    });
}
</script>

□ 핵심 내용 : 아작스를 사용하여 실시간으로 즉시 변화는것을 확인하여 활용할 수 있음 this 와 이벤트 객체를 사용하면 거의 모든게 가능해짐

1. JAVA script 에서 서버로 직접 요청 [보안성 낮음]

2. 서버 : 서버로 요청

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-webflux</artifactId>
	</dependency>
    

□ get 방식으로 서버로 데이터를 보내면 -> 받은 데이터를 다른 서버로 보낸다
다른서버에서는 받은 데이터를 -> 보낸 서버로 되돌려 보내고 -> 이것을 클라이언트로 되돌려준다

3. 다른 서버로 요청을 보내고, 응답을 받는 기능 만들기

□ webClient 는 String 5.0 에서 부터 지원하는 라이브러리이다.
□ 이전에는 HTTPCOnnection(Spring 기본내장) -> RestTemplate 등을 사용 했었다.
□ Non-Blocking 방식을 지원하기 때문에 비동기 처리가 가능하여 속도면에서 우월하다[많은 통신이 이루어질때 유리함]
□ Non-Blocking 방식을 지원하기 때문에 비동기 처리가 가능하여 속도면에서 우월하다
□ get 방식 전송과 post 방식 전송이 조금 다르다.

□ get 방식 전송

public Map<String, String> getSend(String msg){
	□ 1. 어디로 보낼지
	WebClient client = WebClient.create("http://localhost:8080");
	
	□ 2. 전송 방식 지정 + 상세 URL추가(있으면)+ 전송
	□ retrieve() : 전송 후 body 값을 받아온다.
	□ exchange() : 전송 후 상태값 헤더값을 받아온다.(테스트 이외에는 잘 사용하지 않음)
	□ bodyToMono() : 동기 통신시 사용 (한번에 1개 요청 처리 시)
	□ bodyToFlux() : 비동기 통신시 사용 (한번에 여러개 요청 처리 시)
	Mono<Map> mono = client.get().uri("/return/"+msg).retrieve()
	.bodyToMono(Map.class);
	 
	□ 3. 받아온 Mono로 부터 자바 객체를 빼 온다. [규격이 서로 맞아야 된다.]
	Map<String, String> resp = mono.block();
	logger.info("response : "+resp);
	return resp;
	

}

□ post 방식 전송

  • Mono mono 방식 : 보낼 데이터가 하나일 경우 사용

    	public List<Map<String, Object>> postSend(String val, String key) {
    		□ 1. 어디로 보낼지
    		WebClient client = WebClient.create("http://localhost:8080");
    		□ 2. 파라메타 추가
    		FormInserter<String> form = BodyInserters.fromFormData("cnt", val);
    		□ 파라메타를 추가하고 싶다면 아래방법도 있다 (MultiValueMap에 담아서 한번에 보낸느게 더 낫다.)
    		□ form.with("name","value");
    	
    		□ 3. 전송 방식 지정 + 상세 URL추가(있으면)+ 헤더값 + 파라메터를 담은 form추가 + 전송
    		Mono<List> mono = client.post().uri("/listReturn").header("authrorization", key).body(form).retrieve().bodyToMono(List.class);
    	
    		□ List<Map<String, Object>> list = mono.block(); // 이 방식이 간단하기 하지만 속도면에서 다른 방식을 추천한다.▼
    		List<Map<String, Object>> list = mono.flux().toStream().findFirst().get();
    	
    		logger.info("response : "+list);
    		return list;
    	}

    □ Flux flux 방식 : json 형태로 파라메터를 보내고 싶을 경우 (복잡한 형태 및 데이터를 여러개 보낼 경우)

      public List<Map<String, Object>> fluxTest() {
          □ 1. 어디로 보낼지
          WebClient client = WebClient.create("http://localhost:8080");
    
          □ paeam 추가
          Map<String, Object> json = new HashMap<String, Object>();
          json.put("age", 40);
          json.put("nama", "KIM");
          json.put("married", false);
          json.put("score", new int[] {30,40,50,60,70});
    
          □ json 형태로 파라메터를 보내고 싶을 경우
          □ bodyValue() 를 사용한다.
          □ 받는곳에서는 @RequsetBody로 받아줘야 한다.
          Flux<Map> flux = client.post().uri("/fluxReturn").bodyValue(json).retrieve().bodyToFlux(Map.class);
    
          List<Map<String, Object>> list = flux.toStream().collect(Collectors.toList());
          logger.info("response : "+ list);
          return list;
      }

    □ 받는곳에서는 @RequsetBody로 받아줘야 한다. (13_Webclient/ RecvController)

      @PostMapping(value="/fluxReturn")
      public List<Map<String, Object>> fluxReturn(@RequestBody Map<String, Object> param){
          logger.info("json params : {}",param);
          List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
          Map<String, Object> map = null;
    
          for (int i = 0; i < 11; i++) {
              map = new HashMap<String, Object>();
              map.put("no", i);
              map.put("name","LEE");
              map.put("salary",i*100000);
              list.add(map);
          }
          return list;
      }

Properties 활용

  • Spring 에서는 주요 정보를 properties 파일에 저장해 놓거나 불러와서 사용 한다.
  • Xml 이나 properties 는 정보를 컴파일 하지 않기 때문에 쉽게 읽고 수정이 가능 하다.
  • 하지만 보안 성 측면에서는 위험할 수 있다.

□ IPV6 -> IPV4 로 변환할 경우

  • run as -> run configuration -> arguments -> vm 에 아래 내용 추가
  • -Djava.net.preferIPv4Stack=true

□ application.properties 에서 관리자 계정 생성
[# user setting] user.id = userAdmin, user.pw = pass@Goodee, user.ip = 127.0.0.1

□ application.properties 에 있는 값을 가져오기 
@Value("${user.id}")private String user_id;
@Value("${user.pw}")private String user_pw;
@Value("${user.ip}")private String user_ip;

AOP

  • Aspect Oriented Programming : 관점 지향 프로그래밍

대표적인 기능 Interceptor ( 다음 회차 )

  • Interceptor 를 활용 하면 Controller 도착 전 특정 작업을 수행 하거나
  • Controller 를 지나 client 에 도착 전 특정 작업을 수행 할 수 있다.
profile
[JAVA]

0개의 댓글