[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을 완성해주세요.
arr1 | arr2 | return |
---|
[[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입니다.
array | commands | return |
---|
[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) {
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"
s | result |
---|
"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));
}
}