Spring REST API 작성하기 (2) - service 이용/DB
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기능을 모두 구현해볼예정