IT 프로그래밍-Web

[Web] Spring Boot로 Rest API만들기(2/3)

godsangin 2019. 12. 3. 16:45
반응형

저번 시간에 이어서 Rest API만들기 실습은 진행하도록 하겠습니다.

MVC패턴의 Controller까지 만들었다면 남은건 이제 Model입니다.(View는 지난 실습에 사용했던 hello.html이라고 할 수 있겠습니다.)

우선 model을 만들고 controller와 연결시키기 위한 패키지를 만듭니다.

dto, dao, service

여기서 dto는 모델객체를 정의하고 getter,setter만들 정의한 말 그대로 Model입니다.

그리고 dao는 정의한 모델에 대한 CRUD기능만을 담당하고 있습니다.

그리고 service에서 우리가 원하는 기능을 커스텀할 수 있도록 작성하였습니다.(혹시 제가 이해하는 바가 아니라면 알려주세요..ㅠㅠ)

간단한 예제를 위해 스마트폰을 판매하는 매장에서 기기들을 들여오고 매장에 있는 스마트폰의 가격 총합을 api로 반환한다고 가정해 봅시다.

아래는 dto패키지의 Phone.java입니다.

package com.example.demo.dto;

public class Phone {
	String model;
	int price;
	int volume;
	int quantity;
	public Phone(String model, int price, int volume) {
		super();
		this.model = model;
		this.price = price;
		this.volume = volume;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getVolume() {
		return volume;
	}
	public void setVolume(int volume) {
		this.volume = volume;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(((Phone)obj).getModel().equals(model)) {
			return true;
		}
		return false;
	}
	@Override
	public String toString() {
		return "Phone [model=" + model + ", price=" + price + ", volume=" + volume + ", quantity=" + quantity + "]";
	}
	
	
	
	
}

 

다음으로는 dao패키지의 PhoneDao.java입니다.

package com.example.demo.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.dto.Phone;
@Repository
public class PhoneDao {
	ArrayList<Phone> myPhoneList;//추후에 db로 바뀔 예정
	public PhoneDao() {
		myPhoneList = new ArrayList<Phone>();
		init();
	}
	public void init() {
		addPhone(new Phone("iPhoneX", 1000000, 64));
		addPhone(new Phone("Note10", 1080000, 128));
	}
	public boolean addPhone(Phone p) {
		myPhoneList.add(p);
		return true;
	}
	
	public List<Phone> getPhoneList() {
		return myPhoneList;
	}
	
	public boolean deletePhone(Phone p) {
		myPhoneList.remove(p);
		return true;
	}
	
	public boolean updatePhone(Phone p) {
		for(Phone phone:myPhoneList) {
			if(phone.getModel().equals(p.getModel())) {
				phone = p;
				return true;
			}
		}
		return false;
	}
	
}

 

updatePhone을 저렇게 사용하면 실제로 업데이트가 될지 모르겠네요..실습을 진행하면서 안된다면 for문을 수정하도록 하겠습니다..!

마지막으로 service패키지의 PhoneService.java입니다.

package com.example.demo.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demo.dao.PhoneDao;
import com.example.demo.dto.Phone;

@Service
public class PhoneService {
	@Autowired
	PhoneDao phoneDao;
	
	public int getAllPhonePrice() {
		List<Phone> phones = phoneDao.getPhoneList();
		int price = 0;
		for(Phone phone: phones) {
			System.out.println(phone.toString());
			price += phone.getPrice();
		}
		return price;
	}
}

 

자! 이제 Rest API는 다 만든것이나 다름없습니다.

dto는 일반적인 getter,setter만을 가진 클래스이므로 dao부터 살펴볼까요?? local환경이지만 아직 데이터베이스를 가지지 못한 환경이기 때문에 init함수를 통하여 2개의 휴대폰 정보를 삽입합니다.(가격과 용량은 제멋데로 정했습니다.)

그런 뒤 검색, 추가, 삭제, 수정 순으로 메소드를 작성합니다.(여기서 작성한 메소드를 주로 Service에서 사용합니다.)

마지막으로 원하는 정보를 담은 기능을 service에서 구현합니다. PhoneDao를 통해 얻은 리스트에서 가격의 합을 리턴하는 간단한 함수입니다.(여기서 AutoWired는 객체의 초기화를 돕는 어노테이션입니다.)

 

여기까지 완료했다면 지난번에 작성한 Controller만 업데이트하면 됩니다. Model과 Controller를 연결시켜준다고 생각하시면 될 것 같습니다.

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.service.PhoneService;

@Controller
public class MyController {
	@Autowired
	PhoneService phoneService;
	@GetMapping("/")
	public String getHTMLHello() {
		return "hello";
	}
	@GetMapping("/allprice")
	@ResponseBody
	public int getAllPhonePrice() {
		return phoneService.getAllPhonePrice();
	}
}

 

allprice라는 링크를 추가합니다. 이는 html파일이 아닌 수치만을 반환할 것이기 때문에 spring에게 결과값이 ResponseBody라는 것을 알려주어야 합니다. 그래서 @ResponseBody라는 어노테이션을 추가합니다.

이제 실행해볼까요 ??

 

위와 같이 매장에 있는 스마트폰의 총 가격을 알 수 있었습니다.

이처럼 작성한 Rest API를 DB에 저장하고, 서버에 올리면 여러분이 알고있는 Rest API처럼 사용할 수 있게 됩니다.(실상은 훨씬 더 복잡할테지만..!)

다음 시간에는 현재까지 작성한 정보를 mysql 데이터베이스로 저장할 수 있도록(영구적으로 보관 가능하도록) 하는 실습으로 찾아뵙도록 하겠습니다.