오늘은 코드카타 SQL과 알고리즘 51, 52번 문제를 풀고, 일정관리 앱 Dev 과제를 마무리했다!
오늘은 총 2개의 SQL 문제를 풀었는데,
한 문제는 join을 사용해 하나의 테이블에는 데이터가 있고, 다른 테이블에는 데이터가 없는 친구들을 출력하는 것이었고,
다른 한 문제는 2개의 조건을 걸어 데이터를 출력하는 것이었다.
두 문제 다 이전에 풀어본 적 있는 유형의 문제들이라 큰 문제 없이 해결할 수 있었다.
알고리즘 문제도 2문제를 풀었는데,
첫 번째 문제는... 링크로 확인하는게 빠를 것이다..
문제를 이해하는 데에 어려움이 있었지만.. 막상 해결하는 것은 반으로 나눠서 문자열에 앞뒤로 더하기만 하면 됐다.
그래서 큰 문제 없이 해결할 수 있었다.
두 번째 문제는 a개의 콜라병을 가져가면 b개의 새 콜라를 준다고 했을 때, n개를 가져가면 총 몇 병을 마실 수 있는가에 대한 문제이다.
나는 n을 a로 나눴을 때의 몫과 나머지를 각각 저장해서 while문 안에서 계속 계산을 반복시키며 풀었다.
사실 내가 진짜 계산하는 그대로 로직을 작성해두었기 때문에,, 별 다른 어려움 없이 문제를 해결할 수 있었다.
그런데, 다른 사람들의 풀이를 보니 다들 무슨 공식을 가져와서 풀더라...
이래서 컴공에서 수학을 알려주나보다.. 수학 공부해야겠다..
각각의 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기
오늘로 진짜 진짜 일정관리 앱 Dev 프로젝트가 끝났다!!
사실 오늘 그냥 리팩토링만 하고 마치려고 했는데!! 스탠다드반 세션에서 '필터'에 대해 알려주셨다.
과제 자료의 한 구석에 필터를 사용하라고 적혀있었다는데,, 나는 자료를 그리 꼼꼼히 보지 않아서 모르고 넘어갔었다.
이걸 사용하지 않아도 되는 것 같기는 했지만, 시간이 남아있는김에 필터에 대해 찾아보고 적용하기로 했다.
필터는 말 그대로 필터링을 해주는 것인데, 사실 이건 스프링 컨테이너에서 관리하는 것이 아니라 서블릿 컨테이너에서 관리하는 것이다.
이 필터를 통과해야지만 서블릿에 도달해 컨트롤러에게까지 전달된다.
이게 전에 튜터님께서 나중에 배울거라고 알려주신 것인가보다.
필터 또한 스프링에 이미 구현되어 있는 Filter 인터페이스가 있었다.
여기에는 총 3개의 메서드가 있는데,
필터 객체를 초기화하는 init(), 필터 객체를 제거하는 destroy(), 그리고 실제 필터를 만들 수 있는 doFilter() 메서드가 있다.
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 컨트롤러가 실행되기 전에 작동시킬 내용
filterChain.doFilter(request, response);
// 컨트롤러 실행 후, 응답 보내기 전에 작동시킬 내용
}
}
아래와 같이 filterChain의 doFilter 앞뒤로 내가 원하는 로직을 작성해서 필터를 구현하면 된다.
사실 필터 구현 자체는 그리 문제가 되지 않았다.
문제는 필터 내부에서 발생한 예외를 처리하는 것이었는데...
앞서 말한 것처럼 필터를 통과하고 난 후에 스프링 컨테이너에 닿을 수 있다.
그러니 아무리 스프링 컨테이너 안에서 ExceptionHandler를 만들어두었다고 해도 필터에서 생긴 예외까지는 처리할 수 없는 것이다.
이 문제를 해결하기 위해서 필터의 예외를 처리하기 위한 필터를 새롭게 만들었다.
새로운 필터에서 try-catch문을 통해 다음 필터로 넘겨주고, 다음 필터에서 예외가 발생하면 catch를 통해 예외를 처리하게 되는 것이다.
여기까지는 이해가 되었지만, response를 만드는 부분은 인터넷에 있는 자료를 긁어와서 겨우겨우 처리했다..
이 부분은 나중에 강의에서도 다뤄주신다고 하니.. 그때 더 알아봐야겠다.
그리고 오늘은 이번 과제의 해설 강의가 있는 날이었다!
해설 강의를 통해서 아주 유용한 것을 배웠는데, 바로 '정적 팩토리 메서드'라는 것이다.
정적 팩토리 메서드란 Static Method를 통해 간접적으로 생성자를 호출하는 메서드이다.
public class Dto {
private String field;
// 생성자
private Dto(String field) {
this.field = field;
}
// 정적 팩토리 메서드
public static Dto convert(AnotherDto a) {
return new Dto(a.getField(););
}
}
위와 같이 메서드를 생성할 수 있다.
원래는 서비스 클래스 안에서 하나하나 new를 사용해 DTO 객체를 만들어야 했다.
그러니 DTO 객체의 필드 중 하나만 바꿔도 그게 생성된 모든 곳에 가서 다 수정을 했어야 했는데,
위와 같이 정적 팩토리 메서드를 사용하게 되면 convert 메서드 내부에서만 수정을 해주면 된다!
그리고 메인 로직의 코드도 훨씬 더 깔끔해질 것이다.
과제의 요구사항들을 구현하는 것 자체에서는 큰 문제가 없었지만, 오늘 해설 강의를 통해 좋은 사용법을 알아갈 수 있었다.
이번 프로젝트의 최종 코드는 깃허브에 업로드해두었다.
GitHub 보러가기
이제 Spring의 강의를 듣고 개인 과제를 하는 시간은 끝났다,,
내일부터는 진짜 팀 프로젝트가 시작된다!!
기대되기도 하지만, 긴장된다... 일단 열심히 해봐야겠다..