일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- TCP
- eof
- 자바
- java11
- java
- graphql
- Mongoose
- puppeteer
- MapReduce
- nodejs
- 조건문
- 프로그래머스
- Scanner
- k8s
- redis
- 서버
- mongodb
- ai
- Apollo
- HTTP
- Docker
- mysql
- 스프링부트
- LangChain
- 스프링
- restapi
- bufferdreader
- Android
- Spring
- 백준알고리즘
- Today
- Total
자라나라 개발머리
1. 스프링부트로 REST API 서버 만들기 본문
참고:
1) 인프런 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' - 코드 참고
2) 스프링부트 - 10분만에 안드로이드 앱, 아이폰 앱에서 사용할 수 있는 Restful API 서버 만들기
https://www.youtube.com/watch?v=nrxzK_ky3uc
3) RESTful API란 무엇인가요?
https://aws.amazon.com/ko/what-is/restful-api/
4) REST API란? REST, RESTful이란?
안드로이드 스튜디오에 연결할 REST API 서버를 만들었다.
API(Application Programing Interface)란?
다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙
REST API란?
REST라는 소프트웨어 아키텍쳐를 기반으로 만들어진 API
REST란?
1. HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
ex) URI: /member
2. HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해, 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미
ex) URI: /member, Method: GET ==> 멤버조회기능 구현
장점
- 유연성: RESTful 웹 서비스는 완전한 클라이언트-서버 분리를 지원한다.
- 독립성: REST API는 사용되는 기술과 독립적이다. API 설계에 영향을 주지 않고 다양한 프로그래밍 언어로 클라이언트 및 서버 애플리케이션을 모두 작성할 수 있습니다. 또한 통신에 영향을 주지 않고 양쪽의 기본 기술을 변경할 수 있다.
REST API 서버 만들기
스프링 부트 프로젝트 생성
위와 같이 설정! Generate 해준 뒤 원하는 경로에 압축 풀어주고 인텔리제이로 실행하면 끝!
코드 작성
인프런 스프링 입문 강의의 코드와 매우 흡사! 중간중간 수정한 부분만 코멘트 하려한다.
회원 객체 (Member.java)
package com.example.spring.domain;
public class Member {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
회원 리포지토리 인터페이스(MemberRepository.java)
package com.example.spring.repository;
import com.example.spring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
회원 리포지토리 구현체(MemoryMemberRepository.java)
package com.example.spring.repository;
import com.example.spring.domain.Member;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
public void clearStore() {
store.clear();
}
}
아직 DB 연결이 안됐기 때문에 메모리에 저장되는 레포지토리를 사용한다.
회원 서비스(MemberService.java)
package com.example.spring.service;
import com.example.spring.domain.Member;
import com.example.spring.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public Long join(Member member) {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
회원 컨트롤러 (MemberController.java)
package com.example.spring.controller;
import com.example.spring.domain.Member;
import com.example.spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping("/Member/{id}")
public Optional<Member> getMember(@PathVariable("id") Long id) {
return memberService.findOne(id);
}
@GetMapping("/Member/all")
public List<Member> getAllMember() {
return memberService.findMembers();
}
@PutMapping("/Member/new/{name}")
public void putMember(@PathVariable("name") String name) {
Member member = new Member();
member.setName(name);
memberService.join(member);
}
}
유튜브 영상과 스프링 입문 강의에서 쳤던 코드를 짬뽕 시켜놨다.
1. @RestController
@Controller 대신 @RestController를 썼다.
@RestController는 @Controller에 @ResponseBody가 합쳐진 것이다.
Json 형태로 객체 데이터를 반환하는 역할을 하며, REST API를 개발할 때 주로 사용한다고 한다.
2. getMember(), getAllMember(), putMember()
MemberService에 있는 메소드들을 활용해서 만들었다.
@PathVariable은 url에 입력한 값을 변수로 받는 어노테이션이다.
의존관계 설정 (SpringConfig.java)
package com.example.spring;
import com.example.spring.repository.MemoryMemberRepository;
import com.example.spring.repository.MemberRepository;
import com.example.spring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {return new MemberService(memberRepository()); }
@Bean
public MemberRepository memberRepository() { return new MemoryMemberRepository(); }
}
테스트
@GetMapping 은 웹 브라우저에서도 테스트하기 쉬우나, @PutMapping은 제대로 실행이 됐는지 확인하기가 어렵다.
그 때 쓰는 툴이 POSTMAN이다.
POSTMAN에서 테스트 한 결과, 아래처럼 회원 가입(저장)이 가능하고 개별 회원, 전체 회원이 Json으로 반환되는 REST API 서버가 만들어졌다!
200OK가 뜨면 정상 실행된 것이다! 같은 방식으로 두어개 더 회원가입 시키고 다시 전체 조회해보면!
Json 형태로 메모리에 저장된 회원 정보들이 뜬다!
개별조회도 잘 된다.
'프로젝트 > 개인' 카테고리의 다른 글
1. node.js - MongoDB 개발 환경 세팅 / DB 연동 (0) | 2023.06.05 |
---|---|
0. Node.js - MongoDB GraphQL API 서버 구현 개요 / 리서치 (0) | 2023.06.05 |
3. 스프링 부트 - 안드로이드 스튜디오 연결/Retrofit2 (완) (0) | 2023.02.25 |
2. 스프링 부트 - MySQL 연결 (JPA 사용) (0) | 2023.01.28 |
0. 안드로이드 스튜디오 - 스프링 부트 - MySQL 프로젝트 (0) | 2023.01.19 |