분류 전체보기

    [스프링 웹 MVC 동작 원리] Front Controller 가 무엇인가요?

    [스프링 웹 MVC 동작 원리] Front Controller 가 무엇인가요?

    👻 Front Controller 에 대해 알아보자! 기존 Servlet 방식은 Client 에서 요청이 Servlet Container로 가서 Servlet을 생성하고 Controller 를 실행 합니다. 기존 Servlet의 단점은 Url 이 다른 요청이 들어오면 Servlet 을 매번 다르게 생성해야 하는 문제가 있습니다. 이 단점을 보안하여 나온 방식이 Front Controller 입니다. Front Controller 는 모든 요청을 앞 단의 하나의 Controller 로 받고 받은 요청들을 해당 Handler 에 Dispatch 해줍니다. 이 기능은 Spring 에서 DispatcherServlet 으로 정의 하고 있습니다. 동작 원리를 그림으로 이해해 봅시다!.

    [스프링 웹 MVC 동작 원리] Servlet 환경에서 Spring Ioc Container 활용

    [스프링 웹 MVC 동작 원리] Servlet 환경에서 Spring Ioc Container 활용

    👻 Servlet 환경에서 Spring Ioc Container 를 활용해 보자! ConTextLoaderListener 를 배포 서술자에 설정하여 ServleContext 의 Life Cycle 에 맞춰 Spring Ioc 의 ApplicationContext 를 바인딩 해줍니다. 어떻게 ApplicationContext 를 생성할까요?? ContextLoaderListener 의 클래스 내부에 contextInitialized() 라는 메서드가 있는데 ServletContextEvent 를 인자로 받아 생성합니다.

    [스프링 웹 MVC 동작 원리] ServletFilter 동작 원리

    [스프링 웹 MVC 동작 원리] ServletFilter 동작 원리

    👻 ServletFilter 동작 원리에 대해 알아보자! ServletFilter 의 동작원리는 Servlet 에게 요청이 보내지기 전에 앞 단에서 전처리 과정을 거치는 과정을 거칩니다. 특징으로는 Chain 구조로 이루어져 있습니다. 즉, 순서가 있다는 것인데, 순서 설정은 배포 서술자 에서 설정이 가능합니다. 동작원리를 그림으로 이해해 봅시다!

    [스프링 웹 MVC 동작 원리] ServletListener 동작 원리

    [스프링 웹 MVC 동작 원리] ServletListener 동작 원리

    ServletListener 동작 원리 👻 ServletListener 동작 원리에 대해 알아보자! ServletListener 는 Servlet의 이벤트를 감지하여 처리하는 역할을 합니다. ServletListener 을 사용하려면 배포 서술자에 ServletListener 을 설정 해야합니다. 동작 원리는 servlet 이 생성후 service() 기능이 실행되었을 때 이벤트를 감지하여 처리하고 Response object 로 응답을 내립니다. 그림으로 보고 이해해 봅시다!.

    [스프링 웹 MVC 동작 원리] Servlet 동작 원리

    [스프링 웹 MVC 동작 원리] Servlet 동작 원리

    👻 Servlet 동작 원리에 대해 알아보자! Servlet 이란 Client 에서 요청이 들어오면 그에 맞는 service 기능을 매핑 해줘야 하는데 이 기능을 하는 것이 Servlet 이라고 합니다. Servlet 은 ServletContainner 가 생성을 해주고 관리를 해줍니다. Client 가 자원을 관리하는 Server 에게 자원의 요청을 하면 Server 는 ServletContainner 에게 요청을 보냅니다. 이때 ServletContainner 에서는 Request object 와 Response object 가 생성이 되고 배포 서술자에 매핑된 Servlet 을 찾아 생성을 해줍니다. 다음으로 Service() 메서드가 실행되고 전송 방식에 따른 메서드가 호출 되면서 앞서 생성된 R..

    [Book] 5) 롬복(Lombok) 을 사용해보자!

    🕶 롬복(Lombok) 의존성을 추가해보자! 롬복을 사용하기전에 의존성을 추가해야합니다. 그러므로 build.gradle 파일에 가서 compileOnly 'org.projectlombok:lombok:1.18.22' 을 추가해 줍니다, 빌드를 실행하고 플러그인에 가서 Lombok 을 설치해 줍니다. 🕶 의존성을 추가해줬다면 롬복기능을 사용해보자! 지금의 프로젝트처럼 작은 규모가 아닌 큰 규모에 프로젝트였다면 롬복으로 전환이 쉽게 됬을 까요?? 쉽지 않았을 겁니다. 매번 코드에 Lombok 기능을 추가하고 코드를 수정하고 반복적인 작업이 될겁니다. 그리고 수정한기능이 제데로 작동하는지 알 수 가 없었을 겁니다. 하지만 지난 시간에 작성한 테스트 코드 로 인해 쉽게 검증을 할 수 있습니다. 이러한 이유로 ..

    [Book] 4) HelloController 생성과 테스트를 해보자!

    👻 메인 클래스를 살펴봅시다. @SpringBootApplication -> 1 public class BoardSpringbootWebserviceApplication{ public static void main(String[]args) { SpringApplication.run(BoardSpringbootWebserviceApplication.class, args); } } @SpringBootApplication 으로 인해 스프링 부트의 자동 설정과 스프링이 관리하는 Bean 읽기와 생성을 모두 자동으로 설정됩니다. 주의 : @SpringBootApplication 이 있는 위치부터 설정을 읽어가기 때문에 이클래스는 항상 프로젝트의 최상단에 위치해야만 합니다. main method 에서 실행하는 S..

    [Book] 3) 테스트 코드를 작성해보자!

    🕶 들어가기 앞서... 견고한 서비스를 만들기 위해서는 TDD 하거나 최소한 단위 테스트 코드를 꼭 작성 해야합니다. 대부분의 회사가 테스트 코드에 관해 요구를 하고 있으며 채용 정보를 보아도 “테스트의 경험이 있는 분" 을 많이 뽑는 것을 볼 수 있습니다. 이처럼 테스트 코드는 절대 빠질 수 없는 요소 중에 하나라고 볼 수 있습니다. 먼저 테스트 코드를 작성하기 전에 TDD 와 단위 테스트에 대한 개념들을 조금씩 살펴 봅시다. TDD 는 테스트가 주도하는 개발을 의미합니다. “테스트 코드를 작성을 하며 개발을 진행한다.” 라는 이야기입니다. 단위 테스트 는 TDD의 첫번째 단계인 기능 단위 테스트 코드를 작성하는 것을 이야기 합니다. 지금은 TDD 가 아닌 단위 테스트 코드 를 배우는 것을 목표로 두고..

    [Book] 2) 인텔리제이에서 깃허브와 연동해보자!

    🕶 인텔리제이에서 깃허브와 연동해보자! IT 개발자들 사이와 회사들은 보통 버전 관리를 깃허브를 통해서 관리합니다. 깃허브를 사용하는 방법을 따로 공부하시면 좋겠습니다. 깃허브는 무료로 사용할 수 있는 장점과 가장 대중적인 repository 입니다. 인텔리제이에서 Aaction 창 을 열고 share project on github 을 검색하여 실행해줍니다. 로그인창이 나오 실 텐데 깃허브 아이디 비밀번호를 입력하시고 로그인을 해주고 share 버튼을 누릅니다. 처음으로 commit 을 할 건지 창이 나올 겁니다. 이때 우리는 commit 이전에 깃허브에 올리지 않아도 되는 파일들이 있으므로 No 버튼을 누릅니다. 다음 창에 commit 을 진행 할 파일들을 선택하는 창이 나올 겁니다. 이때 idea ..

    [Book] 1) 프로젝트를 만들고 의존성을 추가해보자!

    인텔리제이가 설치 되었다는 가정하에 진행 해보도록 하겠습니다. 🕶 프로젝트를 만들고 의존성을 추가해보자! 우선 인텔리제이를 열어서 프로젝트를 만듭니다. 프로젝트 이름은 되도록이면 무슨 서비스인지 알만한 이름으로 지어주시면 좋습니다. 프로젝트 이름을 지어주셨다면 gradle 를 선택하여 프로젝트를 만듭니다. 다음으로 의존성 을 추가해야 합니다. 기본적으로 implementation 'org.springframework.boot:spring-boot-starter-web' 를 선택하여 만듭니다. 필요한 의존성이 있으면 프로젝트를 만든 후에도 추가를 할 수 있습니다. 프로젝트 만들기를 진행하시고 추가한 의존성이 있어 빌드 하는데 시간이 걸립니다. 빌드가 완료 되면 build.gradle 파일을 열어 의존성이 ..

    [Book] ITEM 9) try-finally 대신 try-with-resource 를 사용하라

    🤢 try-finally 사용 public String fileRead1(String file)throws IOException { BufferedReader br = null; try{ br = new BufferedReader(new FileReader(file)); return br.readLine(); } catch(Exception e) { e.printStackTrace(); }finally{ br.close(); } return file; } 예외를 잡는데 여러줄의 코드가 작성되었습니다. 이러한 경우 예외가 발생하면 스택 트레이스에 추적이 어려울 것입니다. 이 방법의 대안점은 try-with-resource 를 사용하는 것입니다. 🤢 try-with-resource public String ..

    [Book] ITEM 8) finalizer 와 cleaner는 피하라

    finalizer 는 Object의 finalizer() 메서드를 말합니다. gc 의 대상이 되는 인스턴스가 있으면 finalizer() 메서드가 작동이 되어야하는데 finalizer() 는 동작의 예측이 불가능합니다. 예제를 보면서 확인 해 봅시다. Finalizer 클래스가 있고 오버라이드 한 finalize() 메서드와 hello() , hello2() 메서드가 있습니다. public class Finalizer { @Override protected void finalize()throws Throwable{ System.out.println("finalize 동작"); } public void hello() { System.out.println("hello 동작"); } } Main 클래스가 있고..

    [Book] ITEM 7) 더이상 쓰지 않는 객체 레퍼런스는 없애자

    자바에서 가비지 컬렉터는 필요 없는 메모리를 관리해 주는 역할을 해줍니다. 하지만 가비지 컬렉터에게 모든 메모리 관리를 맡기면 안됩니다. 예를 보겠습니다. 😱 Stack 의 메모리 누수 Stack 클래스의 코드를 살펴보겠습니다 public class StackSample { private Object[] elements; private int size = 0; private static final intDEFAULT_INITIAL_CAPACITY= 16; public StackSample() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++]= e;..

    [Book] ITEM 6) 불필요한 객체는 만들지 말자

    기능적으로 동일한 객체를 새로 만드는 대신 객체 하나를 재사용하는 것이 적절합니다. 🥺 문자열 객체 문자열 객체 를 예로 들어봅시다. String name = "name"; String name1 = "name"; String name2 = new String("name"); // 불필요한 객체 예시 System.out.println(name == name1); // true System.out.println(name1 == name2); // false System.out.println(name1.equals(name2)); // true 저렇게 new 를 써서 객체를 생성하면 다른 객체가 생성되어 같지 않습니다. 하지만 new 를 쓰지 않고 객체를 생성 JVM 내부에서 동일한 리터럴값을 재사용하기 때..

    [Book] ITEM 5) 리소스를 엮을 때는 의존성 주입을 선호하라

    Repository 로 예를 들어 보겠습니다. InterfaceRepository 인터페이스가 save() 라는 기능을 가지고 있습니다. public interface InterfaceRepository { T save(); } 이를 구현한 MemoryBookRepository 클래스와 JdbcBookRepository 클래스를 생성합니다. public class MemoryBookRepository implements InterfaceRepository { @Override public Book save() { return null; } } public class JdbcBookRepository implements InterfaceRepository { @Override public Book save..