목록전체 글 (314)
ecsimsw
내가 공부하는 방법 솔직히 공부 방법에 대해 생각해 본 적 없다. 다른 크루들이 뚝딱 본인의 공부 방법을 정리한 것을 보면서 나만 학습 방법에 아무런 생각이 없었나 하는 반성이 들 정도였다. 그래서인지 이번 미션 주제는 더 많은 시간이 필요했다. 1. 일단 설명하기 남들 앞에서 설명할 수 있도록 준비하는 것이 정말 좋은 공부 방법이라고 생각한다. 물론 남들 앞에서 설명하는 것이 쉽지는 않다. 다른 사람에게 설명할 수 있도록 준비하는 것은 분명히 많은 시간과 노력이 필요하다. 그 과정이 어렵고 오래 걸리는 것은 사실이지만, 반대로 준비에 필요한 노력만큼 큰 결과물을 얻을 수 있다고 생각한다. 우선 집중력을 끌어올리기 좋다. 자칫 늘어질 수 있는 학습에 새로운 긴장을 만들 수 있고, 발표 일정에 맞춰 준비해..
FrontController 패턴이란 기존 서블릿 개발에선 처리 내용 당 서블릿을 정의해줘야하고, 핸들러의 공통 로직들이 매번 중복된다는 문제가 있다. 예를 들면 카페에서 메뉴마다 담당하는 직원이 있다고 생각하자. 아메리카노를 요청하면 아메리카노만을 담당하는 직원이 나와 주문을 받고, 음료를 만들고 포장하고, 카페모카를 요청하면 카페모카만을 담당하는 직원이 나와 주문을 받고, 음료를 만들고 포장해 전달해주고... 매번 반복되는 처리 패턴에서 음료 레시피만 변하고 있다. 반복되는 작업을 전면에서 처리하고, 음료를 만드는 것은 각자 따로 관리되면 어떨까? 매니저는 앞에서 주문받고 계산만하고, 요청 음료를 만들 수 있는 직원에게 음료 제작을 맡기고 음료가 나오면 다시 포장해서 전달하는 즉, 손님의 요청을 '앞..
웹 서버와 WAS 태초의 웹 서버는 정적인 파일만을 요청, 응답하였다. 요청에 해당하는 응답이 항상 일정한 페이지만을 만들 수 있었다. 인터넷이 등장하면서 동적인 페이지에 대한 요구가 증가하였다. 기존의 정적 처리만 가능하던 서버에 동적 처리를 위한 프로그램(Application)을 붙인 Web Application Server를 만들게 되었다. 이를 앞 글자를 따 WAS라고 부른다. 즉, 정적 처리만 가능했던 웹 서버에, Container를 붙여 동적 처리가 가능하도록 한 것이 WAS인 것이다. 이때 Container는 동적 처리를 위한 프로그램들의 구동 환경 제공 정도로 생각하면 된다. 예를 들어 동적 처리를 위한 프로그램을 Servlet이라 한다면, WAS의 Container는 Servlet Con..
양방향 의존성을 피하라 양방향 의존성은 정말 안좋은 참조 패턴이다. '의존'이라는 말마따라 A가 변경될 때 B가 변경되어야하고 B가 변경되면서 다시 A가 영향을 받게된다. '우아한테크세미나'에서 조영호님은 이를 '하나의 클래스로 봐야할 것을 억지로 찢은 형태'라고 표현하셨다. 양방향 의존성은 성능 이슈를 만들고, 양쪽 객체의 싱크를 맞추기 위한 노력이 필요하게 된다. 또 메소드 순환 호출을 야기한다. 이런 양방향 의존을 피하기 위한 패턴으로 다음 두 가지 방식이 자주 소개된다. 1. 인터페이스 사용으로 의존성 분리 2. 중간 객체를 만들어 사이클을 끊는다. 이 두 가지 방식에 대한 예시는 다음에 정리하려고 하고, 이번 글에서는 스프링에서 생성자 주입을 이용하면 이런 양방향 의존을 피할 수 있음을 소개하고..
HandlerMapping과 HandlerAdapter (@포모) 같이 공부하는 친구가 HandlerMapping과 HandlerAdapter의 차이를 질문해주었다. 내가 모호하게 알고 있었다는 것을 펜을 들고 설명하는 순간 알게 되었다. 혼자 머릿속에서 정리하는 것과 말로 설명할 수 있는 것은 정말 차이가 큰 것 같다. 질문을 받는 것은 정말 감사한 일이다. 아 그리고 부끄럽지만 영어 철자를 좀 제대로 봐야겠다. 안다고 생각했던 단어였는데 칠판에 쓰고 설명하려니 철자가 버벅인 경우도 많았다. 웃어 넘겼지만 평소에 조금 더 신경써서 봐야겠다. HandlerMapping FrontController 패턴으로 모든 요청을 DispatcherServlet이 처리한다. DispatcherServlet은 사용자의..
DTO DTO는 Data Transfer Object로 레이어 간 데이터 교환을 위해 사용한다. 예를 들면 Controller에서 View로 출력할 데이터를 넘겨줄 때 DTO를 사용했다. 또는 DB에서 꺼낸 데이터를 담아 가져오기 위해 사용했다. public class GameInfoDto { private final String[][] board; private final double score; public GameInfoDto(String[][] board, double score) { this.board = board; this.score = score; } public GameInfoDto(Board board, Score score) { this(board.parseUnicodeBoard(),..
근데 이제 운동을 곁들인 평소의 나는 혼자만의 시간에서 에너지를 충전했다. 책 읽고, 영화보고, 알고리즘 문제를 풀고, 침대에 누워서 유튜브를 보면서 휴식을 취했던 것 같다. 최근 들어 답답함을 많이 느끼고 있다. 자취를 시작해서 밥 먹는 것도 일이 되었고, 코로나로 나가지 못하니 너무 답답하고 지루하다. 어떤 추가 공부보다도 에너지를 낼 수 있는 동적인 활동이 지금 내게 더 필요하다고 느꼈다. 우선은 내가 하고 싶은 활동 목록을 생각해보았다. 당분간, 적어도 이번 달은 일부러라도 밤 늦게 공부와 정적인 휴식을 줄여볼 생각이다. - 운동하기. 하루 운동을 안했으면, 11시 이후 코딩 금지. - 아침 출근 길 조깅. 아침 밥 꼭 챙겨먹기. - 시원한 맥주마시면서 떠들기.
Optional로 Null 을 알리는 습관 어떤 로직의 계산 결과가 없음을 알리는 방법으로 가장 쉬운 것은 역시 null을 반환해버리는 것이라고 생각한다. 그 계산 결과를 받아서 처리하는 다음 로직에서 null을 어떻게 처리할지를 전혀 신경쓰지 않는다면 말이다. 그렇다면 반환된 결과가 null인지 매번 if문으로 체크를 해야할 것이다. null이 가능함을 생각하지 못하고 오류를 만들 여지가 있고, 처리한다고 하더라도 가독성이 좋지 못한 코드를 만들어야할 것이다. 자바에서도 직접적인 null 비교 (ex, car == null)를 피할 수 있도록 Objects 클래스에 isNull(), nonNull(), requireNonNull() 과 같은 메소드를 제공하고 있다. Optional을 사용하면 계산의 결..