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