[01.03] 내일배움캠프[Spring] TIL-45

박상훈·2023년 1월 3일
0

내일배움캠프[TIL]

목록 보기
45/72

[01.03] 내일배움캠프[Spring] TIL-45

1. Spring 중간 미니 프로젝트

오늘의 진행상황

  • 깃 허브에서 협업을 하는 과정에서의 오류와 개인 질문에 대해 답변할 때 시간을 거의 소비했다.
  • 테스트 코드를 내가 짜놓은 비지니스로직으로 테스트 해보고 싶었지만 테스크 코드는 짜보지 못했다.
  • 갑자기 코테가 풀고싶어서 코테를 풀었다.

Test코드 개념

  • @ExtendWith(MockitoExtension.class) // 설정 문제, 이 선언을 해줘야 mock인식으로 run
  • User user = mock(User.class)
  • @InjectMocks // 가짜 객체 삽입,
    LikeCommentService likeCommentService;
  • When(user.getUserName()).thenReturn(“userA”)
    -> user.getName() 했을 때 리턴나올 값도 넣어줘야함!
  • When(userRepository.findByUserName(user.getName())).thenRetrurn(user)
  • if ~ else 분기점 마다 성공케이스 실패케이스 나눠서 테스트해볼 것!!

팀원들의 코드를 같이 고민하며 해결한 부분(트러블 슈팅)

  • 1) 게시글 작성했을 때 TimeStamped를 상속해서 받는 ModifiedAt,CreatedAt이 들어가지 않아요!!
    -> SpringApplication ( 빈을 생성하고 전체적 코드를 동작시키는 부분)에 @EnableJpaAuditing가 빠져있었다.
    -> 위에 어노테이션을 까보니 @EntityListeners(AuditingEntityListener.class)가 붙어있는 클레스의 엔티티의 변수 값 @CreatedAt,@ModifiedAt를 채워주는 것 같다.
  • 2) ResponseEntity로 반환할 때 잘 모르겠어요.
    -> 사실 Dto로 모든 결과를 반환해주지만, ResponseEntity<ResponseDto>로 반환 타입을 설정해놓고,
    return new ResponseEntity<>(responsedto,Httpstatus.OK)이런식으로 많이 작성이 되어있다.
    -> 근데 사실 엔티티 객체를 new하는 방식보다 ,
    return ResponseEntity.status(HttpStatus.OK).body(responseDto)식으로 작성하는게 더 좋다는 문서를 언뜻 본적이 있다.
    -> 어쨋든 둘의 반환 값은 같지만 ResponseEntity에 관해서 다시 돌아볼 수 있었던 좋은 계기였다.
  • 3) 왜 Service에서 그냥 ResponseEntity로 감싸서 반환하면, Controller에서 서비스단 로직 호출하고 결과 도출할 때, return service.login()만 하면되는데 번거롭게해요?
    -> 물론 동작상의 차이는 없다.
    -> 하지만 Service에서는 해당 비지니스로직을 수행한 후 결과를 Dto담아 반환해주면, Controller에서 응답을 ResponseEntity로 감싸 리턴해주는게 생각의 흐름상 맞다...
  • 4) 확실히 큰틀을 잡고 시작했음에도 각자의 전에 작성했던 코드도 있고, 생각의 흐름이 조금씩 달라서 변수명, Dto 변수등이 API명세, UML설계 처럼 딱딱 맞춰지지 않아서 오류가 많이 발생했다.

오늘의 깨알 상식

if(comment.getUser().getId().equals(user.getId())|| user.getUserRoleEnum().equals(UserRoleEnum.ADMIN)
  • 위와 같이 해당 댓글의 유저이거나, 관리자 권한일 때 어떠한 작업을 해주기 위한 조건문이 비즈니스 로직에 들어가있다.
  • 하지만 이 코드를 다른사람이 딱 봤을 때 그러한 의도라고 한눈에 파악하기 어렵다..
if(authenticatedUser.isVaild()) // 
if(authenticaedUser.isAdmin())
  • 이런식으로 그 엔티티를 활용해 로직을 수행하는 부분은 해당 엔티티에 위임함으로써 비즈니스 로직의 코드 가독성을 높힐 수 있다.

2. Java - CodingTest

Level - 0

행렬의 덧셈

  • 문제 설명
    행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
  • 입출력 예시
arr1arr2return
[[1,2],[2,3]][[3,4],[5,6]][[4,6],[7,9]]
[[1],[2]][[3],[4]][[4],[6]]
class Solution {
       public int[][] solution(int[][] arr1, int[][] arr2) {

        //행렬의 덧셈
        int[][] answer = new int[arr1.length][arr1[0].length];
        for (int i = 0; i < arr1.length; i++) {

            for (int j = 0; j < arr1[i].length; j++) {

             answer[i][j] = arr1[i][j]+arr2[i][j];
            }
        }



        return answer;

    }
}

k번째 수

  • 문제 설명
    배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
    예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
    array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
    1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
    2에서 나온 배열의 3번째 숫자는 5입니다.
  • 입출력 예시
arraycommandsreturn
[1, 5, 2, 6, 3, 7, 4]][[2, 5, 3], [4, 4, 1], [1, 7, 3]][5, 6, 3]
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] array, int[][] commands) {

        //배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때 k번째에 있는 수를 구하려고 한다,.

        int[] answer = new int[commands.length];


        for (int i = 0; i < commands.length; i++) {
            List<Integer> resList = new ArrayList<>();
            int first = commands[i][0];
            int second = commands[i][1];
            int choose = commands[i][2];


            for(int j = first-1;j<=second-1;j++){
                resList.add(array[j]);
            }

            Collections.sort(resList);

            answer[i] = resList.get(choose-1);

        }


        return answer;
    }
}

숫자 문자열과 영단어

  • 문제설명
    다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
    1478 → "one4seveneight"
    234567 → "23four5six7"
    10203 → "1zerotwozero3"
  • 입출력 예시
sresult
"one4seveneight"1478
"23four5six7"234567
"2three45sixseven"234567
"123"123
class Solution {
    public int solution(String s) {

        char[] resList = s.toCharArray();
        StringBuffer strNum = new StringBuffer();


        for (int i = 0; i < resList.length; i++) {
            if ((int) resList[i] < 65) {
                strNum.append(resList[i]);
            } else {
                switch (resList[i]) {
                    case 'z':
                        strNum.append("0");
                        i = i + 3;
                        break;
                    case 'o':
                        strNum.append("1");
                        i = i + 2;
                        break;
                    case 'e':
                        strNum.append("8");
                        i = i + 4;
                        break;
                    case 'n':
                        strNum.append("9");
                        i = i + 3;
                        break;
                    case 't':
                        if (resList[i+1] == 'w'){
                            strNum.append("2");
                            i=i+2;
                            break;
                        }else{
                            strNum.append("3");
                            i=i+4;
                            break;
                        }
                    case 'f':
                        if(resList[i+1]=='o'){
                            strNum.append("4");
                            i=i+3;
                            break;
                        }else{
                            strNum.append("5");
                            i=i+3;
                            break;
                        }
                    case's':
                        if(resList[i+1]=='i'){
                            strNum.append("6");
                            i=i+2;
                            break;
                        }else{
                            strNum.append("7");
                            i=i+4;
                            break;
                        }
                }
            }


        }

        return Integer.parseInt(String.valueOf(strNum));
    }
}
profile
기록하는 습관

0개의 댓글