반응형
오늘은 18~19강 @PutMapping @DeleteMapping 에 대해 공부해보았다.
18강에서 공부한 내용은 아래와 같다.
수정하는 메서드에 변수가 없으면 null로 셋팅되기 때문에 원하지 않는 결과를 얻을 수 있어 주의해야 한다.
19강에서 학습한 내용은 아래와 같다.
*PersonController.java
package com.fastcampus.javaallinone.project3.mycontact.controller;
import com.fastcampus.javaallinone.project3.mycontact.controller.dto.PersonDto;
import com.fastcampus.javaallinone.project3.mycontact.domain.Person;
import com.fastcampus.javaallinone.project3.mycontact.repository.PersonRepository;
import com.fastcampus.javaallinone.project3.mycontact.service.PersonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RequestMapping(value = "/api/person")
@RestController
@Slf4j
public class PersonController {
@Autowired
private PersonService personService;
@Autowired
private PersonRepository personRepository;
@GetMapping("/{id}")
public Person getPerson(@PathVariable Long id){
return personService.getPerson(id);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void postPerson(@RequestBody Person person) {
personService.put(person);
log.info("person -> {}" , personRepository.findAll());
}
@PutMapping("/{id}")
public void modifyPerson(@PathVariable Long id, @RequestBody PersonDto personDto){
personService.modify(id, personDto);
log.info("person -> {}" , personRepository.findAll());
}
@PatchMapping("/{id}")
public void modifyPerson(@PathVariable Long id, String name){
personService.modify(id, name);
log.info("person -> {}" , personRepository.findAll());
}
@DeleteMapping("/{id}")
public void deletePerson(@PathVariable Long id){
personService.delete(id);
log.info("person -> {}" , personRepository.findAll());
}
}
*PersonService.java
package com.fastcampus.javaallinone.project3.mycontact.service;
import com.fastcampus.javaallinone.project3.mycontact.controller.dto.PersonDto;
import com.fastcampus.javaallinone.project3.mycontact.domain.Person;
import com.fastcampus.javaallinone.project3.mycontact.repository.PersonRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
@Service
@Slf4j
public class PersonService {
@Autowired
private PersonRepository personRepository;
public List<Person> getPeopleExcludeBlocks(){
// List<Person> people = personRepository.findAll();
// return people.stream().filter(person -> person.getBlock() == null).collect(Collectors.toList());
//people 리스트 중에서 block 이 되지 않은 값만 리턴
return personRepository.findByBlockIsNull();
}
public List<Person> getPeopleByName(String name){
// List<Person> people = personRepository.findAll();
//
// return people.stream().filter(person -> person.getName().equals(name)).collect(Collectors.toList());
return personRepository.findByName(name);
}
@Transactional
public Person getPerson(Long id){
// Person person = personRepository.findById(id).get();
Person person = personRepository.findById(id).orElse(null);
// System.out.println("person : " + person);
log.info("person ; {}", person); //log출력을 제한할 수 있는 장점이 있어서 print보다 많이 쓴다.
return person;
}
@Transactional
public void put(Person person){
personRepository.save(person);
}
@Transactional
public void modify(Long id, PersonDto personDto){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
if(!person.getName().equals(personDto.getName())){
throw new RuntimeException("이름이 다릅니다.");
}
person.set(personDto);
personRepository.save(person);
}
@Transactional
public void modify(Long id, String name){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
person.setName(name);
personRepository.save(person);
}
@Transactional
public void delete(Long id){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
person.setDeleted(true);
personRepository.save(person);
}
}
아래 테스트를 작성 시 Slf4j import가 안되는 경우
build.gradle 에 아래와 같은 코드를 추가해주면 된다.
testImplementation 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
*참고한 블로그: blog.naver.com/2mcinme/222064051712
(먼저 이 험난한 길을 가신 패캠 선배님ㅋㅋㅋ)
*PersonControllerTest.java
package com.fastcampus.javaallinone.project3.mycontact.controller;
import com.fastcampus.javaallinone.project3.mycontact.repository.PersonRepository;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@Slf4j
class PersonControllerTest {
@Autowired
private PersonController personController;
@Autowired
private PersonRepository personRepository;
private MockMvc mockMvc;
//BeforeEach를 달면 매 테스트마다 한번씩 실행이 됨
@BeforeEach
void beforeEach(){
mockMvc = MockMvcBuilders.standaloneSetup(personController).build();
}
@Test
void getPerson() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.get("/api/person/1"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("martin"));
}
@Test
void postPerson() throws Exception{
mockMvc.perform(
MockMvcRequestBuilders.post("/api/person")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content("{ \"name\": \"martin2\",\n" +
" \"age\": 20,\n" +
" \"bloodType\": \"A\"}"))
.andDo(print())
.andExpect(status().isCreated());
}
@Test
void modifyPerson() throws Exception{
mockMvc.perform(
MockMvcRequestBuilders.put("/api/person/1")
.contentType(MediaType.APPLICATION_JSON_VALUE)
//수정하지 않는 항목도 들어있어야 결과값이 null로 바뀌지 않음.
.content("{ \"name\": \"martin\",\n" +
" \"age\": 20,\n" +
" \"bloodType\": \"A\"}"))
.andDo(print())
.andExpect(status().isOk());
}
@Test
void modifyName() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.patch("/api/person/1")
.param("name","martin22"))
.andDo(print())
.andExpect(status().isOk());
}
@Test
void deletePerson() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.delete("/api/person/1"))
.andDo(print())
.andExpect(status().isOk());
log.info("people deleted : {}", personRepository.findPeopleDeleted());
}
}
*build.gradle(mycontact)
plugins {
id 'org.springframework.boot' version '2.2.9.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.fastcampus.javaallinone.project3'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.jetbrains:annotations:19.0.0'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.platform:junit-platform-launcher:1.5.0'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.0'
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.5.0'
testImplementation 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
test {
useJUnitPlatform()
}
패스트캠퍼스 강의: https://bit.ly/3ilMbIO
반응형
'언어공부 > JAVA&SPRING' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 35회차 미션 (0) | 2020.09.13 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 34회차 미션 (0) | 2020.09.12 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 32회차 미션 (0) | 2020.09.10 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 31회차 미션 (0) | 2020.09.09 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 30회차 미션 (0) | 2020.09.08 |
댓글