Hongveloper

    5장. 서비스 추상화

    DAO에 트랜잭션을 적용해보면서 스프링이 어떻게 성격이 비슷한 여러 종류의 기술을 추상화하고 이를 일관된 방법으로 사용할 수 있도록 지원하는지 살펴보자. 5.1 사용자 레벨 관리 기능 추가 5.1.1 필드 추가 실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/5.1.1 5.1.2 사용자 수정 기능 추가 실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/5.1.2 5.1.3 UserService.upgradeLevels() 실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/5.1.3 로직을 보면 로그인 횟수와..

    자바 클래스패스

    이전부터 스프링으로 웹 서비스를 개발할 때 테스트 코드를 짜는 것에 대한 중요성은 일찍히 알고 있었다. 테스트 코드를 만들다 보면 항상 봉착하는 문제가 있었는데 내가 설정한 빈 파일 혹은 JSON과 같은 파일을 어떻게 찾아야 하는지였다. 이럴 땐 항상 이미 성공한 다른 코드를 복붙하기에 바빴다. 그러면서 클래스 패스가 무엇인지 정확하게 모른 채 넘어갔었는데 이번 기회에 부셔보자. 1. 클래스 패스(classpath) 클래스 패스는 쉽게 말해 JVM이 프로그램을 실행할 때 클래스를 찾기 위한 기준이 되는 경로라고 생각하면 간단하다. 만약 클래스 패스를 설정하지 않았다면 디폴트는 현재 경로를 바라보게 된다. 우리가 많이 사용하는 intellij IDE도 클래스 패스를 설정하지 않으면 기본적으로 현재 경로에서..

    4장. 예외

    자바 개발자가 가장 신경 쓰기 귀찮아하는 것 중의 하나가 바로 예외처리다. 정상적인 결과와 흐름을 보여주는 코드를 만들기도 버거운데 예외상황까지 처리해야한다는 사실이 부담스러울 수도 있다. JdbcTemplate을 대표로 하는 스프링의 데이터 엑세스 기능에 담겨 있는 예외 처리와 관련된 접근 방법에 대해 알아본다. 4.1 사라진 SQLException 4.1.1 초난감 예외처리 예외 블랙홀 예외를 잡고는 아무것도 하지 않는다. 예외 발생을 무시해버리고 정상적인 상황인 것처럼 다음 라인으로 넘어가겠다는 분명한 의도가 있는 게 아니라면 연습 중에도 절대 만들어서는 안 되는 코드다. 예외가 발생하면 그것을 catch 블록을 써서 잡아내는 것까지는 좋은데 그리고 아무것도 하지 않고 별문제 없는 것처럼 넘어가 버..

    3장. 템플릿2

    템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. 3.5 템플릿과 콜백 3.5.1 템플릿/콜백의 동작원리 템플릿/콜백의 특징 여러 개의 메소드를 가진 일반적인 인터페이스를 사용할 수 있는 전략 패턴의 전략과 달리 템플릿/콜백 패턴의 콜백은 보통 단일 메소드 인터페이스를 사용한다. 템플릿의 작업 흐름 중 특정 기능을 위해 한 번 호출되는 경우가 일반적이기 때문이다. 콜백은 일반적으로 하나의 메소드를 가진 인터페이스를 구현한 익명 내부 클래스로 만들어진다고 보면 된다. 템플릿/콜백의 작업 흐름 1) 클라이언트의 역할은 템플릿 안에서 실행될 로직을..

    3장. 템플릿1

    템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다, 3.1 다시보는 초난감 DAO 3.1.1 예외처리 기능을 갖춘 DAO 실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.1.1 일반적으로 서버에서는 제한된 개수의 DB 커넥션을 만들어서 재사용 가능한 풀로 관리한다. DB 풀은 명시적으로 close() 메소드를 호출해서 돌려줘야지만 다시 풀에 넣었다가 다음 커넥션 요청이 있을 때 재사용할 수 있다. 스터디에서 try-with-resources로 자원을 반납하는 것에 대해서 이..

    2장. 테스트

    스프링 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트이다. 2.1 UserDaoTest 다시 보기 2.1.1 테스트의 유용성 테스트란 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서 만든 코드를 확실할 수 있게 해주는 작업이다. 2.1.2 UserDaoTest의 특징 웹을 통한 DAO 테스트 방법의 문제점 - 테스트하고 싶었던 것은 UserDao였는데, 다른 계층의 코드와 컴포넌트, 심지어 서버의 설정 상태까지 모두 테스트에 영향을 줄 수 있기 때문에 이런 방식으로 테스트하는 것은 번거롭고 오류가 있을 때 빠르고 정확하게 대응하기가 힘들다. 작은 단위의 테스트 테스트하고자 하는 대상이 명확하다면 그 대상에만 집중해서 테스트하는 것이 바람직하다. 이렇게 작은 단위의 코드에 대해 ..

    1장. 오브젝트 의존관계2

    토비 스프링을 공부하면서 실습했던 내용과 모르는 내용만 기록을 위해서 포스팅한다. 1.5 스프링의 IOC 1.5.1 오브젝트 팩토리를 이용한 스프링 IoC 실습 코드 링크: https://github.com/vvshinevv/toby-spring/tree/feature/1.5.1 스프링에서 빈 팩토리라고 말할 때는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이고, 애플리케이션 컨텍스르라고 말할 때는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미가 좀 더 부각된다. 1.5.2 애플리케이션 컨텍스트의 동작 방식 애플리케이션 컨텍스트는 1) DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메소드 이름을 가져와 빈 목록을 만들어둔..

    1장. 오브젝트 의존관계1

    토비 스프링을 공부하면서 실습했던 내용과 모르는 내용만 기록을 위해서 포스팅한다. 객체지향 프로그래밍이 제공하는 폭넓은 혜택을 누릴 수 있도록 기본으로 돌아가자는 것이 스프링 핵심 철학이다. 스프링이 가장 관심을 많이 두는 대상은 오브젝트이다. 스프링이 관심을 갖는 대상인 오브젝트의 설계와 구현, 동작원리에 더 집중하길 바란다. 1.1 초난감 DAO 1.1.1 User 실습 코드 링크: https://github.com/vvshinevv/toby-spring/tree/feature/1.1.1 자바빈은 디폴트 생성자와 프로퍼티 관례에 따라서 만들어진 오브젝트를 가리킨다. - 디폴트 생성자: 자바빈은 파라미터가 없는 디폴트 생성자를 갖고 있어야 한다. 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하..

    Java Socket Server/Client (TCP 통신)

    HTTP 스터디 과제로 Client로부터 요청 받은 내용을 그대로 출력하는 Echo Server를 만드는 과제를 진행하였다. 인터넷 검색을 하면 자료가 워낙 많아서 쉽게 찾아할 수 있었지만, 역시나 내 것으로 만드려면 포스팅이 제맛이다. HTTP는 OSI에서 Application 계층에서 동작하는 프로토콜이다. 이미 학부 시절 네트워크 수업에서 배웠겠지만 Client와 Server의 네트워크 통신은 OSI 계층 구조를 가지고 있으며 Client 프로세스와 Server 프로세스의 통신이라고 보면 된다. 데이터를 보내는 경우 상위 계층에서 하위 계층으로 데이터는 멀티플렉싱되며, 데이터를 받는 입장에서는 하위 계층에서 상위 계층으로 디멀티플렉싱된다. java.net.* 패키지에서 제공해주는 인터페이스를 통해서..

    CORS 이슈 해결 :: Spring Security

    프로젝트를 진행하면서 CORS 이슈가 발생하여 포스팅을 하면서 정확히 이해하였다. 그러나 스프링 시큐리티를 쓰는 프로젝트에서 Preflight 방식에 이슈가 생겨서 그 내용을 공유하고자 한다. 이전 포스팅의 방식대로 CORS 정책에 맞게 코딩을 하였다. 그러나 Spring Security를 사용하는 서비스에서 Preflight Request 방식으로 요청을 할 때, OPTIONS 메소드 방식으로 요청을 하면 Spring Security에서 권한이 없다고 AccessDeniedExeption을 발생시키는 이슈였다. 이번 포스팅에서 Spring Security에서 Preflight Request 방식을 어떻게 해결하였는지 공유하고자 한다. 문제의 시작 위 코드를 보면, Filter를 상속 받아서 CORS 정..