관리 메뉴

JIE0025

[Postman][3] depth가 1~3 인 카테고리 추가 (컨트롤러 요청메세지 테스트) 본문

백엔드/테스트

[Postman][3] depth가 1~3 인 카테고리 추가 (컨트롤러 요청메세지 테스트)

Kangjieun11 2022. 12. 18. 02:29
728x90


어제 만들어놓은 이 JSON데이터를 보고,
카테고리를 추가하는데 이대로 들어올일은 없다고 생각이 들었다. (자식이 있는 상태로 카테고리 추가하는건 말이 안됨)

이런 이유로 하나씩 추가하면서 테스트 해줄거다

+ depth가 최대 3으로 해줄 것이기 떄문에 DTO 유효성 검사에 MIN(0) MAX(3)으로 줘야겠따.

{
	"id:1,
    "name":"Activity",
    "categoryDepth":0
    "children":[
		{
        	"id": 2,
        	"name": "Study",
        	"categoryDepth": 1,
        	"children": [
          		{
            		"id": 3,
            		"name": "알고리즘",
            		"categoryDepth": 2,
            		"children": [
              			{
                			"id": 4,
                			"name": "개념반",
                			"categoryDepth": 3,
                			"children": []
              			}
                    ]
                }
            ]
        }
   ]
}



POST로 보낼 데이터 생성

{
    "name":"Activity",
    "categoryDepth": 0
}
{
    "name":"Study",
    "categoryDepth": 1,
    "parentId":1
}
{
    "name":"Algorithm",
    "categoryDepth": 2,
    "parentId":2
}
{
    "name":"코테반",
    "categoryDepth": 3,
    "parentId":3
}


전송결과



좋다 순서대로 넣으면 원하는 대로 결과가 나온다!


그럼 이제 부모id가 없는데 데이터를 넣었을 때를 확인해보자.
얘를 그냥 냅다 넣어보면 될것 같다.

{
    "name":"코테반",
    "categoryDepth": 3,
    "parentId":3
}



내가 기대하는건, 부모가 없으면 아예 처리가 안되어야하는 것이다.
따라서 부모를 찾았는데 부모가 없으면 exception을 날려줘야 할 것 같다.
(최선이 아닐수도 있지만... try catch 연습이나하자)


현재 코드

@Transactional
public void createCategory (CategoryDto categoryDto) {

    //부모 정보가 있는지 확인하고, 있으면 저장
    Category parentCategory = null;

    if(categoryDto.getCategoryDepth() > 0) {
        parentCategory = categoryRepository.findById(categoryDto.getParentId()).orElse(null);
    }

    Category category = Category.builder()
            .name(categoryDto.getName())
            .parent(parentCategory)
            .categoryDepth(categoryDto.getCategoryDepth())
            .build();

    //데이터 저장
    categoryRepository.save(category);

    //부모의 자식에 추가
    if(parentCategory != null) {
        parentCategory.getChildren().add(category);
    }
}


개선 코드

@Transactional
public void createCategory (CategoryDto categoryDto) throws NullPointerException {

	//부모 정보가 있는지 확인하고, 있으면 저장
	Category parentCategory = null;

	//depth가 0이 아닌 친구들의 부모 존재 체크
	if(categoryDto.getCategoryDepth()!=0){
		parentCategory = categoryRepository.findById(categoryDto.getParentId()).orElse(null);
		if(Objects.isNull(parentCategory)){
			System.out.println("부모가 null입니다.");
			throw new NullPointerException("parent is null");
		}
	}

	Category category = Category.builder()
                .name(categoryDto.getName())
                .parent(parentCategory)
                .categoryDepth(categoryDto.getCategoryDepth())
                .build();

	//데이터 저장
	categoryRepository.save(category);

	//부모의 자식에 추가
	if(parentCategory != null) {
		parentCategory.getChildren().add(category);
    }

}
@PostMapping
public ResponseEntity createCategory(@RequestBody CategoryDto categoryDto) {
    //categoryService.createCategory(categoryDto);

    try {
        categoryService.createCategory(categoryDto);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return new ResponseEntity(HttpStatus.CREATED);
}




일단 널처리는 잘 된것 같은데 이게 최선일까?


런타임을 보내놓고 보니까 런타임 익셉션이 아니라 상태코드를 바꿔서 보내줘야할것 같은 느낌이 든다.



그래서 컨트롤러를 마지막으로 이렇게 처리했다.

@PostMapping
public ResponseEntity createCategory(@RequestBody CategoryDto categoryDto) {
    //categoryService.createCategory(categoryDto);

    try {
        categoryService.createCategory(categoryDto);
    } catch (Exception e) {
        return new ResponseEntity(HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity(HttpStatus.CREATED);
}

 

오 개인적으로 굉장히 괜찮아보인다!!!!!! 배운거 이것저것 잘 써보는 느낌!!!

오늘은 여기까지 하고 자러가도 될것 같다 ㅎㅎ



++

어디까지가 커밋을 해야하는 범위인지 솔직히 잘 모르겠다.
이전걸 커밋해놓고 개선했다는걸 다시 커밋으로 날려야하나? 풀리퀘는 기능 개발이 끝나고 올려야하는것인가?

아직 헷갈리는게 많다.

 

 

커밋은 최소단위

- Controller, Red service - adkdhkjas 테스트코드까지 작동하는걸

- 일단 얘를 올려

- 거기서 서비스가 수정할 게 있음 > 잘못만들었다는 생각이 들거나 Create 수정을 했는데 delete 코드를 또 만졌어 

파일로 생각하지말고, Create 

 

기능단위가 좋음

 

shelve? 라는 기능이있는데 코드임시저장하는거!

ver a > git pull > a+ > shelve a+임시저장되고 내 코드는 a로 돌아감 > shelve 롤백하면 a+