컴공생의 발자취

[내일배움캠프 41일차 TIL] 테스트 활용 과제 본문

🤝 활동/내배캠TIL

[내일배움캠프 41일차 TIL] 테스트 활용 과제

MNY 2024. 6. 17. 00:59
728x90
반응형
2024.06.14.(금)
오늘의 진도 : 개인과제 Dto, Entity Test 추가하기 진행 중...

생성자가 메서드인 줄 알았던 나..
개인과제, 팀 회의, 코드카타, 면담, 오늘의 회고 이렇게 5개의 큰 틀로 나누어 정리할 것이다.

 

개인과제

  • 진행 상황
    • AOP 추가하기 : 완료
    • Dto, Entity Test 추가하기 : 진행 중
  • AOP 추가하기
    • Java 로깅 logger, log4j, logback, slf4j 비교
    • RequestContextHolder
 

Java 로깅 logger, log4j, logback, slf4j 비교

로그(log)는 소프트웨어의 이벤트를 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미합니다. 소프트웨어 개발 과정 혹은 개발 후에 동작상태를 파악하여 문제가 발생했을 때

0soo.tistory.com

 

[SpringBoot] RequestContextHolder

RequestContextHolder는 Spring 컨텍스트에서 HttpServletRequest에 직접 접근 할 수 있도록 도와주는 역할을 한다. 활용 시 HttpServletRequest를 사용하기 위해 이를 메소드 파라미터로 연이어 넘겨받을 필요가

yoonnyoon.tistory.com

 

  • AOP 추가하기(코드)

aop > RequestInfoLogAop.java

package com.sparta.moviefeed.aop;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j(topic = "RequestInfoLogAop")
@Aspect
@Component
public class RequestInfoLogAop {

    @Pointcut("execution(* com.sparta.moviefeed.controller..*(..))")
    private void forAllController() {}

    @Around("forAllController()")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String method = request.getMethod();
        String url = request.getRequestURI();

        try {
            // 핵심기능 수행
            Object output = joinPoint.proceed();
            return output;
        } finally {
            log.info("[RequestInfoLog] Method = {}, URL = {}", method, url);
        }
    }
}

 

  • Dto, Entity Test 추가하기(코드)

test > entity > BoardTest

package com.sparta.moviefeed.entity;

import com.sparta.moviefeed.dto.requestdto.BoardRequestDto;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class BoardTest {
    private BoardRequestDto boardRequestDto;
    private Board board;

    private String title;
    private String content;
    private User user;

    @BeforeEach
    void setUp() {
        title = "Test Title";
        content = "Test Content";

        boardRequestDto = new BoardRequestDto(
                title,
                content
        );

        board = new Board(boardRequestDto, user);
    }

    @Test
    @DisplayName("객체 생성 확인")
    void testUserCreation() {
        assertEquals(title, board.getTitle());
        assertEquals(content, board.getContent());
        assertEquals(user, board.getUser());
    }

    @Test
    @DisplayName("게시물 수정")
    void testUpdate() {
        String newTitle = "Test NewTitle";
        String newContent = "Test NewContent";

        BoardRequestDto requestDto = new BoardRequestDto(newTitle, newContent);

        board.update(requestDto);

        assertEquals(newTitle, board.getTitle());
        assertEquals(newContent, board.getContent());
    }
}

 

  • 오늘의 삽질
    • aop > RequestInfoLogAop : Pointcut에서 .하나 빼먹음..
      @Pointcut("execution(* com.sparta.moviefeed.controller{.여기ㅠ}.*(..))")

 


팀 회의

  • 와이어프레임, erd, API 명세서 작성할 Tool 정하기
    • figma board에서 모두 작성
    • erd - ERDcloud / API명세서 - Notion 팀 페이지에 figma board에서 작성한 것을 기반으로 다시 작성
  • code convention
    • package name : 소문자, 대표적인 것 위주 ex) service, controller, repository...
    • ResponseEntity : CommonResponse 사용
    • 계층형? 도메인형? : 프로젝트 발제 후 결정
  • git rules
    • 깃허브 브랜치 네이밍 : 작업타입/#이슈번호 기능 ex) feat/#issueNum user
    • 깃허브 커밋 규칙 : 작업타입 : 작업내용

 


코드 카타

* 프로그래머스로 진행

 

  • SQL
    •  5월 식품들의 총매출 조회하기

 


면담(질문)

* 대충 면담 후 내 기준 정리..
* 실제 이야기와 다르게 받아들였을 수 있다.

 

  • Q : entity를 테스트 해보기 위해 생성자를 만들었는데, 이렇게 만들어진 생성자나 dto에 있는 생성자들도 테스트를 만들어야 하나요? 과제 조건에서 entity & dto의 메서드들에 대한 테스트를 만들라고 명시되어 있습니다.
    • 일단 생성자는 메서드가 아니다.
    • 3개 중에서 1개만 유효할 경우에 대한 고찰...
  • Q : 취업 포트폴리오.. 어떻게 해야 경쟁력 있을까요?
    부트캠프의 포트폴리오만으로는 경쟁력이 없다고 들었습니다..
    • 부트캠프의 포트폴리오만으로 들어간 사람도 있을텐데 그런 사람들은 굳이 부트캠프 포트폴리오만으로 들어갔다고 얘기할 필요가 없고, 들어가지 못한 사람들이 그렇게 얘기하기에 그런 말이 나올 수 있다.
      그러니 너무 불안해하지 말고 지금의 공부에 집중하면 된다!!!
  • Q : 생성자를 여태까지 메서드인 줄 알았습니다..
    이를 통해 개념이 부족하다고 생각이 들었는데, 어떻게 해야 할까요?
    • 일단, 지금 불편함이 없으면 그걸 다시 공부하는 데 스트레스 받지 않아도 된다. 나중에 다시 공부하면 되기 때문이다. 물론, 면접이나 이런 데에서 모른다면 부끄러운 일이 될 수 있지만, 지금 상황에서는 중요하지 않다.
  • Q : 캠프를 수료 후 취업하게 된다면 첫 회사일텐데, 정확하게 어떤 회사를 가고 싶다는 기준이 없습니다. 그냥 일단은 들어가봐야 아니까 크게 생각하지 않았는데, 그렇게되면 흔히 말하는 물경력?이 될 수 있다고 확실한 기준을 잡는게 좋다는 얘기를 들었습니다. 
    • 공백기가 있는 것 보다는 물경력이 낫다. 그리고 회사에 들어갈 때 누가봐도 정말 아니다!라는 회사만 아니면 된다. 기본적으로 사수가 있고 기술적으로 리드해줄 수 있는 회사에 들어가야 한다.

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

오전 시간만 제대로 몰입할 수 있었다. 

오후에는 자취방 짐 빼거나 가족모임으로 이리저리 돌아다닌다고 제대로 집중하지 못했다.

그러므로 오전 시간인 약 3시간 정도 집중했다.

 

  • 오늘의 생각

하.. 내 목표는 유지보수랑 예외처리(테스트 포함)를 잘 하는 개발자가 되자인데ㅠ

테스트.. 역시 너무 어려워ㅠ 어떻게하면 좋은 테스트 코드를 작성했다고 할 수 있을까?

막연하게 gpt에게 물어보고 일단은 그걸 토대로 내가 변형해서 따라 작성했는데..

이게 맞을까?

 

  • 내일 학습할 것은 무엇인지

남은 과제를 진행해야겠지..

근데 dto, entity test에서 어떻게하면 좋은 테스트 코드를 지향할 수 있는지 계속해서 고민에 빠져든다.

728x90
반응형