Spring Boot (API)

Spring REST API 작성하기 (2) - service 이용/DB

제컴퓨터에서는 2022. 11. 17. 15:05

 


1. Vo 작성하기 

@Getter / @Setter 등록 하기 

* 객체생성후 setId가 나오지않으면 어노테이션을 붙였어도 getter / setter가 없는걸로 취급되나봄? 그래서

코드 추가해주니 정상적으로돌아감

 

 

2. Repository 생성하기

Repository가 무엇인고하면 Repository는 Database의 CRUD와 같은 부분을 담당하고,
 쿼리문을 관리하기위해 Groovy라이브러리를 다운받고 SQL문을 작성한다.

private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	
	private NoticeRowMapper noticeRowMapper;
	
	//뭐하는애지
	public NoticeRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
		this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
		this.noticeRowMapper = new NoticeRowMapper();
	}
	
	public List<NoticeVO> selecList() {
		 
		//쿼리에 파라미터를 넘길필요가 없으므로  EmptySqlParameterSource.INSTANCE를 던집니다.		
		return namedParameterJdbcTemplate.query(NoticeSql.SELECT,
				EmptySqlParameterSource.INSTANCE, this.noticeRowMapper);
		
		//조회된 데이터 한줄한줄을 cityRowMapper를 통해 매핑해줍니다.
		
	}

 

 

NamedParameterJdbcTemplate 는 뭔지 잘모르겠지만 선언해준뒤 

생성자 작성해서 사용해준다 

 

Groovy 라이브러리 

쿼리문이 간단할때는 사용할필요가없지만 쿼리가 더길어지고 쿼리를 이곳저곳 사용해야할때

쿼리문을 선언해서 불러와 사용할수 있는 라이브러리

 

bulid.gradle 파일에 plugins/dependencies 에 추가를해준다. 

plugins {
  id 'org.springframework.boot' version '2.5.2'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
  id 'groovy'  // 여기 추가
}

dependencies {
  implementation('org.codehaus.groovy:groovy')  // groovy 추가
}

 

Marketplace 에서 검색한뒤 다운로드 해줌

 

Repository 패키지 안에 groovy파일을 생성해준다.

 

package com.bryan.hello.preword.info.repository;

class CitySql{
	public static final String SELECT = """
		SELECT ID, Name, CountryCode, District, Population FROM city LIMIT 1000;
	""";
}

 

SELECT 라는 변수에 쿼리문을 작성해준다. 

 

3. RowMapper 생성하기

RowMapper 원하는형태의 결과값을 반환할수있다 -> 객체로 반환할수있다고하는 새로운 문물을 작성해준다.!

 

package com.bryan.hello.preword.info.repository;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;
import com.bryan.hello.preword.info.model.City;

public class CityRowMapper implements RowMapper<City> {

	@Override
	public City mapRow(ResultSet rs, int rowNum) throws SQLException {
		City city = new City();
		city.setId(rs.getInt("ID"));
		city.setName(rs.getString("Name"));
		city.setCountryCode(rs.getString("countrycode"));
		city.setDistrict(rs.getString("district"));
		city.setPopulation(rs.getInt("population"));
		return city;
	}

}​

 

implement 하고 Rowmapper<객체명>을 해주고 override 해주면 추가된다..

객체을 생성하고 DB컬럼명을 입력해서 객체에 set해주고 해당 객체를 return 해줄수 있다. 

 

-> RowMapper를 통해 조회된 데이터객체를 받아 Repository에서 데이터를 매핑해준다.

 

@Service
public class NoticeService implements NoticeServiceImpl{

		//Repository 객체선언
		private final NoticeRepository noticeRepository;
		
		@Autowired
		public NoticeService(NoticeRepository noticeRepository) {
			this.noticeRepository = noticeRepository;
		}
		
		//Service에서 Repository사용하기
		@Override
		public List<NoticeVO> getNoticeList() {
			return noticeRepository.selecList();
		}
	
		
		
}

 

* 필드주입을 추천하지않는방식임

private NoticeService noticeService ---> xxxx

 

public NoticeController(NoticeService noticeService) { ----> 00000

      this.noticeService = noticeService;

}

생성자를 선언하여 주입하기 

1. 순환참조방지 a가 b를 참조하고 b가 a를 참조할때 문제

2. 테스트하기좋음

3. final선언가능

4. 오류방지 (final 또는 null) 방지가능

 

@RestController
public class NoticeController {
	
	private final NoticeService noticeService;	
	
	public NoticeController(NoticeService noticeService) {
	
		this.noticeService = noticeService;
	}

	//객체반환
	@GetMapping("/noticeList")
	public Object noticeList() {
		System.out.println("noticeList 실행");
		List<NoticeVO> noticeList = noticeService.getNoticeList();		
		return noticeList;
	}
			

}

@RestController -> REST api작성할때 사용하는 어노테이션!

ResponseBoby + Controller의 역할이 결합된 어노테이션이라고 보면된다.

 

Service객체 생성/생성자 생성해준뒤,

객체리턴형식으로 

List<NoticeVO> noticeList = noticeService.getNoticeList();

해주면

 

 

DB 가져오기 성공!

 

다음은 CRUD기능을 모두 구현해볼예정