
전체 글
서블릿, JSP, MVC
서블릿 서블릿을 배웠으니 본격적으로 만들어 봅시다! 서블릿의 핵심은 가지고 있는 데이터를 바탕으로 자바 코드에 HTML을 입력하는 것입니다! @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List items = itemRepository.findAll(); // 바디 입력이기 때문에 타입, 인코딩 설정 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter w = resp.getWriter(); // HTML 입력 w.write(""); w.wr..
HTTP 요청 데이터와 응답 데이터 입력
요청 메시지 데이터(HttpServletRequest) 이제 본격적으로 데이터를 입력해 봅시다. HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 크게 3가지입니다. 쿼리 파라미터(GET) HTML Form (POST) API 메시지 바디(POST, PUT,...) 쿼리 파라미터를 통해 전달 인터넷에 아무 검색이나 해봅시다. 그런 뒤 URI을 보면 https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=쿼리파라미터 물음표(?) 뒤 'name=value' 형태로 되어 있는 것을 알 수 있습니다. 이를 쿼리 파라미터라고 하는데 해당 요소들을 통해 요청 메시지에 데이터를 담을 수 있습니다. ..
MVC 사용 전 서블릿
서블릿 등장 HTTP를 공부하셨던 분이라면, 인터넷을 사용하기 위한 과정들을 간략하게나마 알고 계실 겁니다. 1. Connection을 생성하고, 소켓을 연결 2. HTTP 요청 메시지를 파싱하여 읽기. 3. 요청 메시지의 헤더 정보 파악 3-1. 메서드 파악(GET, POST, PUT, ...) 3-2. 인코딩 타입 (Content-Type) 3-3. 등등.. 4. 요청 메시지 바디 내용 파싱 5. 프로세스 실행 6. 로직 실행 7. DB 최신화 8. HTTP 응답 메시지 생성 9. 응답 메시지 전송 9-1. 소켓 종료, Connection 종료(응답 메시지 전송과 함께 FIN Flag 전송) 서블릿을 사용하기 전에는 이 과정을 모두 개발자가 구현해야 했습니다. 그런데 곰곰이 생각을 해 보면 내용이 계..
객체 생성
객체 생성 시 가장 많이 사용하는 방법은 아무래도 new 키워드와 생성자를 사용하는 것입니다. Apple apple = new Apple(...); Banana banana = new Banana(...); 그런데 인터넷 강의에서도 그렇고 Effective_Java 도서에서도 생성자를 통한 객체 생성은 피하라고 합니다. 그럼 대안이 무엇이 있을까요? 1. 정적 팩토리 메서드 패턴 생성자를 접근제어자를 사용해 감춘 다음 정적 팩토리 메서드를 통해 생성하는 방식입니다. class Apple{ private int weight; private Apple(int weight){ this.weight = weight; } public static Apple makeApple(int weight){ return n..
도메인 로직(2) : 서비스 계층
서비스 계층의 등장 도메인 로직을 선택하고 코드를 짯다면 이제는 이 로직들을 처리해야 합니다. 잘 아시겠지만 도메인 로직만으로 어플리케이션을 실행할 수 없습니다. 이 객체를 사용하는데 필요한 데이터를 DB로 부터 가져와야 하며, 로직을 처리한 결과를 다시 한번 DB에 넣어주는 과정과 후처리를 해주는 과정이 필요합니다. 이렇게 도메인 로직 전 후의 과정의 전체적인 플로우를 애플리케이션 로직이라고 합니다. 이러한 로직들은 어디에 넣어야 할까요? 일단 도메인 로직은 아닙니다. 도메인 로직은 항상 순수하게 도메인 로직 그 자체로 존재(캡슐화)해야 합니다. 그렇지 않으면 의존관계(Dependency)가 생기게 되어(응집도 감소, 결합력 증가) 후 유지 보수에 치명적인 결함을 만들게 됩니다. 도메인 계층의 캡슐화는..
도메인 로직(1)
아키텍쳐의 3가지 대표적인 레이어(프레젠테이션, 도메인, 데이터 리소스) 중 도메인 레이어에 대해 배워봅시다! 도메인 레이어의 패턴은 총 세 가지로 나뉩니다. 트랜잭션 스크립트 도메인 모델 테이블 모듈 어느 것이 가장 좋다 보다는, 그 상황에서 가장 좋은 패턴을 채택하기 때문에 세 가지의 경우를 알아봅시다. (참고로 테이블 모듈의 경우 .NET에서 사용하기 때문에, 자바진영 개발자는 넘어가셔도 무방합니다.) 1. 트랜잭션 스크립트 비즈니스 로직를 프로시저 별로 구성해 각 프로시저가 프레젠테이션의 단일 요청 처리. 스크립트 : 프레젠테이션 입력 -> 도메인 로직 동작 -> 데이터 원본에 저장 -> 다른 시스템에서 잔여 작업 호출 -> 응답 생성 -> 응답 서식을 결정하는 계산 수행 -> 프레젠테이션 응답...
Arrays.asList( )와 List.of( )
자바 8, 9를 들어서며 배열에도 정적 팩토리 메서드가 추가되었습니다. 그래서 저도 잘 활용하고 있었는데.. 문제가 발생했습니다. 바로 swap( )을 사용하는 도중에서 말이죠. public static void main(String[] args) { List testList1 = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); List testList2 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); List result = sortList(testList1); System.out.println(result); } static List sortList(List list) ..
[JUnit5] Extension
테스트를 진행하면서, 추가적인 기능을 부여해야 하는 경우가 종종 있습니다. 이런 기능을 하는 모델들을 확장 모델(Extension Model)이라고 합니다. JUnit4에서 사용했던 Runner, TestRule, MethodRule들이 JUnit5가 되면서 Extension API로 통일되었습니다. Extension 생성 - Lifecycle 사용하려는 케이스에 따라 Extension의 생성 방식 달라집니다. 자세한 내용은 SpringExtension.class를 살펴보시면 됩니다. 먼저 생명 주기를 기준으로 나누어보겠습니다. 생명 주기에 따라 사용되는 Extension이 다릅니다. 크게 범위를 보자면 다음과 같습니다. 실행 순서대로 설명하겠습니다. 1st. TestInstanceFactory 테스트 ..