본문으로 바로가기

06.JpaApi①

category IT/SpringDay 2022. 5. 22. 01:50

 

API란?
: Application Programming Interface 의 줄임말. 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻함.  어떠한 응용 프로그램에서 데이터를 주고 받기 위한 방법. 특히 JSON 형식을 많이 사용함.

[출처]https://jung-story.tistory.com/130

1. 프로젝트 생성하기

2. appliction.yml 작성

  - properties 와 다르게 계층 구조로 표현-> 가독성이 좋음

server:
  port: 8485
#Oracle Connect
spring:
  datasource:
    dbcp2:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521/xe
      username: scottJpa2
      password: tiger
#JPA
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none

 

3. Api를 이용한 회원가입

 1) @RestController = @Controller + @RespnoseBody

   - @Controller는 model 객체를 만들어 데이터를 담고 view를 찾았다면 @RestController는 단순히

   객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP응답에 담아서 전송한다. 

2) @RequestBody

  - 클라이언트가 전송하는 Http 요청의 Body 내용을 JavaObject로 변환시켜주는 역할

  - 쉽게 말해 Http body(POST 방식)안에 json으로 넘어온 값을 vo(데이터 객체)에 바인딩한다. 

3)Valid 

  - @RequestBody 객체에 대한 검증

 

package com.oracle.oBootJpaAPI01.controller;

import javax.validation.Valid;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.oracle.oBootJpaAPI01.domain.Member;
import com.oracle.oBootJpaAPI01.service.MemberService;

import lombok.Data;
import lombok.RequiredArgsConstructor;


//Controller + ResponseBody
@RestController
@RequiredArgsConstructor
public class JpaRestApiController {
	
	private final MemberService memberService;
	
	@PostMapping("/restApi/v2/memberSave")
	public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest requestMemebr) {
		System.out.println("컨트롤러 saveMemberV2 시작 ");
		System.out.println("request.getName() -> " + requestMemebr.getName());
		System.out.println("request.getSal() -> " + requestMemebr.getSal());
		Member member = new Member();
		member.setName(requestMemebr.getName());
		member.setSal(requestMemebr.getSal());
		Long id = memberService.join(member);
		return new CreateMemberResponse(id);
	}
	
	//API는 한군에데서만 사용하기 때문에 내부 class 사용이 더 효율적 
	@Data 
	static class CreateMemberRequest {
		private String 	name;
		private Long 	sal;
	}
	
	@Data
	class CreateMemberResponse {
		private Long id;
		public CreateMemberResponse(Long id) {
			this.id = id;
		}
	}
 
}
package com.oracle.oBootJpaAPI01.service;

import javax.transaction.Transactional;

import org.springframework.stereotype.Service;

import com.oracle.oBootJpaAPI01.domain.Member;
import com.oracle.oBootJpaAPI01.repository.MemberRepository;

@Service
@Transactional
public class MemberService {

	
	private final MemberRepository memberRepository;
	
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}

	//회원가입 
	public Long join(Member member) {
		System.out.println("서비스 회원가입");
		Long id = memberRepository.save(member);
		
		return id;
	}
	

}
package com.oracle.oBootJpaAPI01.repository;

import javax.persistence.EntityManager;

import org.springframework.stereotype.Repository;

import com.oracle.oBootJpaAPI01.domain.Member;

@Repository
public class JpaMemberRepository implements MemberRepository {

	private final EntityManager em;
	
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}

	@Override
	public Long save(Member member) {
		em.persist(member);
		System.out.println("MemberRepository save");
		return member.getId();
	}
}

 

4. Bad API

   - get방식 사용시. 보안취약하며 파라메터 값이 일렬로 나타나게 된다.

//Controller 
@GetMapping("/restApi/v1/members")
	public List<Member> membersV1() {
		System.out.println("컨트롤러 membersV1 실행");
		return memberService.getListAllMember();
	}
    
    
 //Service
 //전체회원 조회
	public List<Member> getListAllMember() {
		List<Member> listMember = memberRepository.findAll();
		System.out.println("서비스 전체 회원 조회");
		return listMember;
	}
 
//Repository
@Override
	public List<Member> findAll() {
		System.out.println("find All 실행 ");
		//Sql no, jpa 문법
		List<Member> memberList = em.createQuery("select m from Member m", Member.class).getResultList();
		System.out.println("find All 끝");
		return memberList;
	}

'IT > SpringDay' 카테고리의 다른 글

Mybatis①  (0) 2022.05.29
06.JpaApi②  (0) 2022.05.24
05.JPA02②  (0) 2022.05.19
05.JPA02①  (0) 2022.05.19
Lombok설치  (0) 2022.05.19