새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
자료구조
학습 목록
- 자료구조 전반적 학습
- JSP 교재 학습
자료구조와 알고리즘
오늘은 방통대 컴퓨터 과학 과목중 자료구조에 대한 학습을 했습니다.
강의 내용 중 기억에 남는 문장이 있습니다.
자료 구조를 잘 설계하면 컴퓨터 성능을 크게 향상시킬 수 있습니다.
그러나 알고리즘을 최적화하면, 때로는 자료 구조 설계가 다소 미흡해도 충분히 성능을 확보할 수 있습니다.
이 말을 다시 정리해보면:
- 알고리즘은 문제를 해결하기 위한 절차적 과정을 명령어의 추상화로 그림이나 글로 표현한 것이며,
- 자료 구조는 데이터를 효율적으로 저장하고 접근하기 위한 구조로, 입력 데이터를 추상화한 상태라고 볼 수 있습니다.
백엔드 개발자로서 문제 해결을 위해서는 효율적인 알고리즘을 작성하는 것이 매우 중요하다는 것을 다시금 느꼈습니다.
요즘 개발을 할 때 머리로 대충 정리만 하고 코드로 작성하던 자신을 되돌아보게 되었습니다.
처음 자바를 배우던 시절에는 슈도 코드나 순서도를 먼저 작성하고 프로그래밍을 했습니다. 그러나 요즘에는 알고리즘을 충분히 설계하지 않고 바로 코드로 작성하니, 결과적으로 코드의 방향성을 잃거나 예상하지 못한 예외 케이스를 만나게 되었습니다.
앞으로는 알고리즘과 자료 구조 사이의 균형을 맞추고, 문제 해결을 위한 슈도 코드나 순서도 작성을 통해서 문제의 논리적인 흐름을 더 잘 파악해야겠다고 다짐해 봅니다.
서블릿
서블릿은 자바에서 서버 측에서 동작하는 하나의 웹 컴포넌트로 동작하며, 클라이언트의 요청을 처리하고 그에 대한 응답을 생성하는 역할을 합니다.
서블릿 규약을 지킨 자바 클래스는 서블릿으로 생성할 수 있으며 web.xml 파일에 규칙에 맞게 등록하면 서블릿 컨테이너는 해당 자바 클래스를 웹 컴포넌트로 동작하도록 관리합니다.
서블릿은 최초 요청이 발생해야 인스턴스가 생성되며 싱글톤으로 관리가 됩니다. 싱글톤이 아니라면 매 요청마다 새로운 서블릿이 생성되기때문입니다.
서블릿은 모든 웹 요청에 공용으로 사용되기 때문에 멤버 변수나 정적 변수에 상태를 저장하는 경우 동시성 문제가 발생할 수 있습니다.
서블릿은 최초 인스턴스를 생성할 때 초기화 메서드를 init()
를 통해서 실행할 수 있으며 최초 1회 실행됩니다.
이후 클라이언트의 요청을 처리하는 메서드인 service()
를 통해서 웹 기능을 수행합니다.
destory()
를 통해서 서블릿이 소멸할 때 안전하게 연결을 종료할 수 있는 메서드를 제공합니다.
서블릿 컨테이너
서블릿 컨테이너는 HTTP 규칙을 추상화하여 HttpServletRequest와 HttpServletResponse를 통해서 제공합니다. 요청 객체와 응답 객체를 구현화된 클래스를 사용하여 서블릿은 응답과 요청을 처리할 수 있습니다.
응답을 처리할 경우 응답에 전송할 내용을 작성해야합니다. HTTP 규칙에 맞게 작성해야합니다.
그래서 contextType을 설정하는 것이 중요합니다.
서블릿 컨테이너에 서블릿을 등록하는 방법은 xml
를 통해서 등록하는 방법과 @WebServlet
어노테이션을 통해서 등록하는 방법이 있습니다.
-
컴파일된 클래스 파일이 먼저 생성된다.
-
서블릿 컨테이너가 실행되면, 클래스 파일들을 스캔한다.
-
어노테이션이 포함된 클래스 파일이 있으면 해당 클래스를 서블릿으로 등록한다.
-
web.xml도 읽어 서블릿을 등록한다.
어노테이션이 변경되면 재컴파일이 필요하다, 왜냐하면 변경된 어노테이션 정보가 클래스 파일에 반영되어야 하기 때문이다.
따라서 어노테이션과 web.xml 파일에 모두 등록한다면 두개의 서블릿이 생성됩니다. 만약 두 url이 같다면 중복 등록이되어 오류가 발생합니다.
이는 HTTP에서 url에 하나의 기능만 가지고 있어야 하기 때문에 중복 url은 등록될 수 없습니다.
URL 매핑
방법 | 특징 | 장점 | 단점 |
---|---|---|---|
doXXX() 메서드 사용 |
doGet() , doPost() 등 각 HTTP 메서드별로 메서드를 구현하여 처리 |
코드가 자동으로 HTTP 메서드에 맞게 분기됨 | 메서드가 많아질 경우, 여러 메서드를 작성해야 함 |
service() 메서드 재정의 |
service() 메서드 내에서 요청 메서드(getMethod() )를 확인하여 분기 처리 |
모든 요청을 한 메서드에서 처리 가능 | 분기 로직을 직접 구현해야 함 |
매핑 규칙도 있습니다.
- 정확한 매핑이 우선
- 와일드 카드
/*
는 후순위
댓글남기기