본문 바로가기
Java

[SpringBoot] RestApi 만들기 (5.5) jdbcTemplate - Insert, Update, Delete

by bryan.oh 2021. 7. 10.
반응형

Spring Boot
JdbcTemplate
NamedParameterJdbcTemplate
Insert, Update, Delete

 

지난 글에서 Post 방식으로 파라메터를 받는 방법도 알아봤었는데요. 지난 글 참고

보통 insert, update, delete 등은 get 방식보다는 post 방식으로 쓰죠.

일단 Controller 에서 post 방식으로 데이터를 받습니다.

<참고 City.java>

더보기
package com.bryan.hello.preword.info.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class City {
	private Integer id;
	private String name;
	private String countryCode;
	private String district;
	private Integer population;
}

INSERT

InfoController.java

@PostMapping(value="cityAdd")
public ResponseEntity<City> cityAdd(@RequestBody City city) {
	try {
		log.debug("city = {}", city.toString());
		return new ResponseEntity<>(infoService.insert(city), HttpStatus.OK);
	}catch (Exception e) {
		log.error(e.toString());
		return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
	}
}

InfoService.java 에 insert() 라는 메소드를 만듭니다.

public City insert(City city) {
	return this.cityRepository.insert(city);
}

repository/CityRepository.java 에 insert() 메소드를 만듭니다.

public City insert(City city) {
	KeyHolder keyHolder = new GeneratedKeyHolder();
	SqlParameterSource parameterSource = new MapSqlParameterSource("name", city.getName())
			.addValue("countryCode", city.getCountryCode())
			.addValue("district", city.getDistrict())
			.addValue("population", city.getPopulation()); 
	int affectedRows = namedParameterJdbcTemplate.update(CitySql.INSERT, parameterSource, keyHolder);
	log.debug("{} inserted, new id = {}", affectedRows, keyHolder.getKey());
	city.setId(keyHolder.getKey().intValue());
	return city;
}

그리고 쿼리를 만들어야죠.

repository/CitySql.groovy

public static final String INSERT = """
	INSERT INTO city (Name, CountryCode, District, Population) values (:name, :countryCode, :district, :population)
""";

id 컬럼은 Auto Incremental 이라서 쿼리에 없습니다.

 

실행

City Table 에 CountryCode 는 Foreign key 가 걸려있으므로, country table 에 있는 countryCode 를 입력해야합니다.

입력 파라메터는

{
  "name": "NY",
  "countryCode": "KOR",
  "district": "NewYork",
  "population": 100
}

결과

AutoIncrement 된 id 를 추가한 city 객체가 return 되었습니다.


Update

update 도 쿼리 빼고는 다를게 없습니다.

이번엔 쿼리부터 만들어보죠.

repository/CitySql.groovy

public static final String UPDATE = """
	UPDATE city SET Name = :name, CountryCode = :countryCode, District = :district, Population = :population WHERE 1=1  
""";

public static final String ID_CONDITION = """
	AND id = :id
""";

repository/CityRepository.java

public Integer updateById(City city) {
	String qry = CitySql.UPDATE + CitySql.ID_CONDITION;
	
	SqlParameterSource parameterSource = new MapSqlParameterSource("id", city.getId())
			.addValue("name", city.getName())
			.addValue("countryCode", city.getCountryCode())
			.addValue("district", city.getDistrict())
			.addValue("population", city.getPopulation()); 
	return namedParameterJdbcTemplate.update(qry, parameterSource);
}

InfoService.java

public Integer updateById(City city) {
	log.debug("city id = {}", city.getId());
	return cityRepository.updateById(city);
}

InfoController.java

@PostMapping(value="cityEdit")
public ResponseEntity<String> cityEdit(@RequestBody City city) {
	try {
		log.debug("city = {}", city.toString());
		Integer updatedCnt = infoService.updateById(city);
		return new ResponseEntity<>(String.format("%d updated", updatedCnt), HttpStatus.OK);
	}catch (Exception e) {
		log.error(e.toString());
		return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
	}
}

실행

URL 바꿔주시고, 파라메터에 id 가 포함되어 있어야 합니다.

 


DELETE

실제 서비스에서는 delete는 잘 안쓰고 flag column 을 만들고 그 상태를 update 합니다.

repository/CitySql.groovy

public static final String DELETE = """
	DELETE FROM city WHERE 1=1  
""";

where 절은 아까 만들었던 ID_CONDITION 을 쓰면 되겠네요.

repository/CityRepository.java

public Integer deleteById(Integer id) {
	SqlParameterSource parameterSource = new MapSqlParameterSource("id", id); 
	return namedParameterJdbcTemplate.update(CitySql.DELETE + CitySql.ID_CONDITION, parameterSource);
}

InfoService.java

public Integer deleteById(Integer id) {
	log.debug("city id = {}", id);
	return cityRepository.deleteById(id);
}

InfoController.java

@ResponseBody
@PostMapping(value="cityDelete")
public ResponseEntity<String> cityDelete(@RequestParam(value="id") Integer id) {
	try {
		log.debug("city id = {}", id);
		Integer deletedCnt = infoService.deleteById(id);
		return new ResponseEntity<>(String.format("%d deleted", deletedCnt), HttpStatus.OK);
	}catch (Exception e) {
		log.error(e.toString());
		return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
	}
}

이번에는 id 만 받아보는 걸 해보려고 @RequestParam 을 써봤습니다.

위에서 했던 insert, update 처럼 City 를 받아와서 id만 빼서 해도되고, 뭐, 상관없습니다.

실행

 

이상 기본적인 쿼리를 실행해봤습니다.

 

Spring Boot Tutorial 시리즈

Spring Boot Tutorial 부록

 

728x90
반응형

댓글