스프링을 편리하게 사용할 수 있도록 굉장히 다양한 spring project을 묶어서 지원단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성가능Tomcat 같은 웹 서버를 내장하여 별도의 웹 서버를 설치하거나 설정하지 않아도 됨.손쉬운 빌드 구성을 위한 start
요구사항 설계 요구사항 회원 가입하고 조회할 수 있다. 회원은 일반, VIP가 있다. 회원 데이터는 자체 DB를 구축할 수 있고 혹은 외부 시스템과 연동할 수 있다.(미확정) 위 요구사항이 들어왔을 때 유능한 개발자는 바로 어떻게 설계할지 떠올릴 수 있어야 한다.
문제점 1. OCP 위반 할인 정책을 변경하려고 봤더니 클라이언트격인 OrderServiceImpl 코드를 고쳐야한다. 이것은 OCP를 위반한 것이다. 2. DIP 위반 그리고 또 위 코드를 자세히 살펴보면 인터페이스만 의존한 것 같지만 사실 new 예약어 오른쪽인
제어의 역전 즉, IoC는 내가 무언가 코드를 호출하는게 아닌 프레임워크가 내 코드를 대신 호출해 주는 것이다.즉, 말 그대로 제어권이 내가 아닌 프레임워크에게로 넘어가면서 나타나는 뜻이다.예를 들어 기존의 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객
앞서 구성 부분으로 따로 빼 두었던 AppConfig 부분을 이제 실제 Spring을 이용해서 바꿔보자.Java with Spring이렇게 하면 @Bean을 추가한 메서드들이 Spring Container에 다 등록이 된다.참고로 @Bean에 속성값을 이용하여 따로 이
ApplicationContext를 스프링 컨테이너라 한다.ApplicationContext는 인터페이스다. => 다형성이 적용되어있다.스프링 컨테이너는 XML을 기반으로 만들수 있고(거의 사용 X), 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.직전에(http
위에서 등록시킨 빈이 잘 등록이 되었는지 조회해보자.테스트 환경에서 조회 함수를 작성해보자.이때 Junit 5 이후 버전은 public을 쓰지 않아도 된다.또 윗 줄에 배열이 있으면 iter IDEA 예약어를 작성하면 자동으로 for문을 작성해준다. 또 sout 뒤에
객체의 최상위가 object가 있는것 처럼 BeanFactory가 존재한다.즉, 스프링 컨테이너의 최상위 인터페이스이다.스프링 빈을 관리하고 조회하는 역할을 담당한다.getBean()을 제공한다.BeanFactory 기능을 모두 상속받아서 제공한다.빈을 관리하고 검색하
BeanDefinition 이라는 개념은 Bean을 정의한 것. 즉, 우리가 앞서 grooby, java, xml로 SpringContainer를 만들 수 있었는데 이는 BeanDefinition이라는 추상화가 있기에 가능했던 것이다.그래서 우리는 BeanDefinit
Spring과 web application의 특수성 spring은 사실 web application 말고도 다양한 애플리케이션을 만들 수 있다. 데몬, 이라든지 배치파일이라든지 말이다. 그런데 web application을 주로 만들 때 사용하고 이는 사용자가 여려명
@Configuration은 사실 싱글톤을 위해 존재하는 것이다.우리가 앞서 작성했던 AppConfig 코드를 봐보자. 우선@Bean memvberService가 -> new MemberyMemberRepository() 를 호출하고@Bean orderService가
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 우리는 xml에서는 `태그를 작성하고 자바코드에서는 @Bean` 어노테이션으로 설정정보에 직접 스프링빈을 등록할 정보를 나열했었다. 하지만 우리가 등록해야하는 빈이 수백개가 되면 어떻게 될까? => 설정정보가 굉장히
의존관계 주입은 크게 4가지 방법이 있다.생성자 주입 (99% 이거 사용)수정자 주입 (setting 주입, 1% 사용)필드 주입일반 메서드 주입의존관계 자동 주입은 스프링 컨테이너가 관리하는 컨테이너(스프링 빈)여야 동작한다.스프링 빈이 아닌 일단 클래스에가서 암만
옵션처리 주입할 스핑 빈이 없어도 동작해야할 때가 있다. 그런데 @Autowired 만 사용하면 required 옵션이 디폴트값이 true로 되어있어서 자동 주입 대상이 없으면 오류가 발생한다. 아래는 예제 테스크 코드이다. @Autowired(required =
롬복과 개발 트랜드 개발을 해보면 대부분(99%)이 불변이고 1%만 불변이 아닌 경우가 있다고 한다. 그래서 보통은 생성자에 final 키워드를 사용하게 될텐데 문제는 생성자도 만들어야하고 주입 받은 값을 대입하는 코드도 만들어야하고 타이팅할 게 한둘이 아니게 된다는
앞서 우리는 @Autowired는 타입으로 조회하는 것을 배웠다.그래서 마치 @Autowired는 ac.getBean() 함수처럼 동작한다고 이해한 바가 있다. 하지만 역시 타입으로 조회할 땐 하위 타입의 빈이 2개이상이 존재할 경우에는 문제가 발생한다.그럼 Disou
앞서 학습한 @Qualifier라는 좋은 빈 판독기를 알아보았다. 하지만 이 어노테이션의 단점은 컴파일시 타입체크가 안 된다. -> 그래서 어노테이션을 집적 만들어서 문제를 해결할 수 있다.우선 프로젝트.프로젝트명 밑에 이름은 annotation이라 하여 package
의도적으로 정말 해당 타입의 스프링 빈이 다 필요한 경우도 있다.예를들어 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정할 때 스프링을 사용하면 소위말하는 전략 패턴을 매우 간단하게 구현할 수 있다.위 코드중 대부분은 앞
왜냐하면 스프링은 @Component, @Controller, @Service, @Repository 처럼 계층에 맞추어 일반적인 어플리케이션 로직을 자동으로 스캔할 수 있도록 지원하게 발전하고 있다.또 boot는 컴포넌트 스캔을 기본으로 사용하고 부트의 다양한 스프링
빈 생명주기 콜백 시작 DB connection pool이나 네트워크 소켓처럼 어플리케이션 시작 시점에 필요한 연결을 뭐 대강 10개면 10개 100개면 100개를 미리 해두고, 왜냐하면 TCP/IP 핸드쉐이킹하고 연결하는데 조금 시간이 걸리기 때문이고 또 연결해둔 걸
빈 스코프란? 지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함게 생성되어 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 말 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링
스프링 컨테이너에 프로토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야한다. 1-1. 클라이언트 A는 스프링 컨테이너에 프로토타입 빈을 요청한다.2-1. 스프링
웹 스코프 웹 스코프의 특징 웹 스코프는 웹 환경에서만 동작한다. 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프의 종류 request : HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는
적용 대상이 클래스면 TARGET_CLASS를 인터페이스면 INTERFACES를 선택해주면 된다.이렇게 하면 MyLogger 클래스의 가짜 클래스(프록시)를 만들어두고 HTTP req와 상관없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.위 Scope 어
Servlet 앞서 Web server에 대해 공부할 때 그런데 비즈니스 로직을 제외한 나머지 기능을 모든 res마다 구현하는 것은 미친짓이라고 하였다. 그리고 개발자가 이를 생략할 수 있도록 도와준 것이 바로 Servlet이라 하였다. 보면 위가 서블릿 코드인데
cmd + e : 마지막 파일 위치로 감 ctrl + shift + T : 테스트 파일 즉석 작성
front-controller 사실 스프링 mvc의 핵심이라고 볼 수 있다. 이 front-controller가 바로 "공통의 관심사"를 모아서 처리해주기 때문이다. 그래서 이 front-controller가 바로 spring mvc의 dispatcherServlet
DisapatcherServlet 그리고 실제 spring mvc가 생긴 모양이다. 굉장히 유사한 모습이다. 물론 기능은 spring mvc가 훨씬 많겠지만 동작과정이 비슷하다는 것이다. 아래 다이어그램을 보면 알 수 있는데 참고로 cmd + O 를 눌러서 검색을
@Controller 는 내부에 @Component가 내장되어있어서 스프링이 뜰 때 컨포넌트 스캔에 걸린다. 그래서 자동으로 스프링 빈으로 등록이 된다. 또한 RequestMappingHandlerMapping에 걸려줘서 매핑 정보로 인식하게 된다. 즉, @Contro
보면 logback과 slf4j가 있는데 둘다 로그라이브러리이다. 로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다.쉽게 이야기해서 SLF4J는 인터페이
Jar vs War Jar를 사용하면 항상 내장 서버(톰캣등)를 사용하고, webapp 경로도 사용하지 않는다. 내장 서버 사용에 최적화 되어 있는 기능이다. War를 사용하면 내장 서버도 사용가능 하지만, 주로 외부 서버에 배포하는 목적으로 사용한다. spring
헤더조회 annoation 기반 spring controller를 찾을 때 RequestMappingHandlerAdapter가 동작한다고 하였다. 그리고 anootation 기반 spring controller는 인터페이스로, 정형화 되어있는게 아니다보니 굉장히 다양
응답에는 3가지 종류가 있다. 정적리소스, view template, HTTP message이중 정적리소스는 /static , /public , /resources , /META-INF/resources 에 위치하며 여기에 있는 파일은 스프링 부트가 뜨면서 정적리소스로
HTTP message converter 기본 동작구조 @ResponseBody 를 사용했을 때 귀찮게 getWriter().write() 하고 또 IOExeption을 추가하지 않아도 됐었다. 왜냐하면 HTTP의 BODY에 문자 내용을 직접 반환했기 때문이다. 이
웹 프로젝트 생성과정 1. 도메인 작성 int나 Long의 원시타입을 사용하지 않은 이유는 null을 넣기 위함다. 즉, 조금 더 널널하게 개발하기 위함이다. @Data를 사용하면 굉장히 편하긴 하나(getter, setter, etc.. 다 만들어줌) 핵심 도메인
Thymeleaf
JS inline 인라인 방식으로 JS를 사용할 수 있도록 해주는 것이다. 만약 vanilla를 사용했다면 코드는 아래와 같다. 그리고 결과는 아래 사진과 같은데 우선 userA가 원래 String이여야하는데 이를 정의하지 않았기 때문에 인식하지 못 하고 또 객체를
스프링에 타임리프 세팅하기 기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymele
만약 기획자가 결과물을 보더니 컬럼 명칭이 마음에 들지 않는다고 바꿔달라고 하면 어떻게 할까?만약 따로 메시지를 관리하는 객체를 만들지 않고 일일이 html 파일에 적어넣었다면 그 개수만큼 고쳐야할 것이다. 하지만 따로 아래처럼 명칭을 관리하는 메시지 객체를 만들고 이
검증 version 1 가장 기초적인 검증방법을 만들어보자. work-flow에 따르면 사용자가 추가페이지(add.html)에서 확인을 눌렀을 때 넘어오는 값을 가지고 유효성 검사 코드를 작성하면 된다. 그런데 html을 수정하기 전에 보면 에러가 나서 control
오류코드와 메시지 처리 앞서 우리가 유효성 검사를 하고 에러를 보면 굉장히 무섭게 생겼다. 그래서 사람 친화적으로 이 메시지를 바꿔보자. codes, arguments
검증로직 분리 컨트롤러의 검증로직 위 코드는 컨트롤러의 1개의 api에 대한 코드를 가져온 것이다. 굉장히 길진 않지만 해당 코드에서 75%를 넘게 검증로직이 자리한 것을 볼 수 있다. 그리고 모든 form데이터가 넘어오는 post마다 이짓거리를 하면 중복되는 코드도
Bean Validation 이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 Bean Validation 이다. 예를들어 빈 값이면 안 된다, 특정 범위 내에 있어야한다 이런거. 그래서 이를 사용하면 애노테이션 하나로 검증 로직을 매
Package 구조 설계 만약 우리가 처음부터 프로젝트를 작성한다고 할 때 패키지 구조를 아래와 같이 domain과 web으로 따로 구조화 해 두는 것이 좋다. hello.login domain item member login web
이는 servlet이 제공하는 기능이다.이 "필터"라는 것은 사용자가 로그인 해야만 사용할 수 있는 각각의 "모든 페이지"에 "적합한 사용자" 인지 판가름을 해야한다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 "공통 관심사(cross-cutti
Servlet Exception 서블릿은 다음 2가지 방식으로 예외 처리를 지원한다. Exception (예외) => default로는 500 error response.sendError(HTTP 상태 코드, 오류 메시지) Exception(예외) 자바 직접 실행 자바
앞서 exception에 관하여 filter와 interceptor에 대해 알아보았는데 이게 또 귀찮은게 WebServerCustomizer 를 만들고예외 종류에 따라서 ErrorPage 를 추가하고예외 처리용 컨트롤러 ErrorPageController 를 만들어야한
서블릿으로 API 예외처리하기 굉장히 기본적으로 ApiExceptionController를 만들어보자. ApiExceptionController 그리고 이제 http://localhost:8080/api/members/ex 이 url로 요청을 보내면 json으로 응
스프링 부트가 기본으로 제공하는 ExceptionResolver 는 다음과 같다. HandlerExceptionResolverComposite 에 다음 순서로 등록.ExceptionHandlerExceptionResolver:@ExceptionHandler 을 처리한다
문제점 java만 이용해서 대충 컨트롤러를 이렇게 만들어놓고 http://localhost:8080/hello-v1?data=1로 요청을 보내면 위 코드에서 HTTP 요청 파라미터는 모두 문자로 처리된다. 따라서 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하
일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다. HTML 폼 전송 방식 application/x-www-form-urlencoded multipart/form-data
JDBC JDBC 등장 이유 일반적인 DB 사용법 커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결한다. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 결과 응답: DB는 전달된 SQL을 수행하고 그
애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.DB 드라이버는 TCP/IP 커넥션이 연결되면 ID,
Transaction이란? 내가 코딩을 막 시작했을 때 정리해 두었던 기억이 있다. 단어의 뜻 정도는 잘 정리 되어있는 것 같다. 트랜잭션 ACID 트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지
애플리케이션 구조 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것 이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술: 서블릿과 HTTP
사용 이유: 반복되는 패턴을 없애고자.템플릿 콜백 패턴을 적용하려면 템플릿을 제공하는 클래스를 작성해야 하는데, 스프링은 TransactionTemplate 라는 템플릿 클래스를 제공한다.execute() : 응답 값이 있을 때 사용한다.executeWithoutRes
예외 계층 Throwable : 최상위 예외이다. 하위에 Exception 과 Error 가 있다. Error : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다.
예외를 전환할 때는 반드시 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다.로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.여기에서 마지막에 ex 를 전달하는 것을 확인할 수 있다.
앞서 우리는 레포지토리의 코드(https://velog.io/@jeong_woo/Spring-rtciiuuk체크예외는 인터페이스에도 명시되어야한다. -> 어차피 특정 Exception에 의존하기 때문에 말짱도루묵그래서 생략해도 되는 체크예외로 만들어줘야한다.우
데이터 접근 기술 소개 데이터 접근 기술 1. SQLMapper SQL Mapper 주요기능 개발자는 SQL만 작성하면 해당 SQL의 결과를 객체로 편리하게 매핑해준다. JDBC를 직접 사용할 때 발생하는 여러가지 중복을 제거해주고, 기타 개발자에게 여러가지 편리한 기
데이터 접근 기술 소개 데이터 접근 기술 1. SQLMapper SQL Mapper 주요기능 개발자는 SQL만 작성하면 해당 SQL의 결과를 객체로 편리하게 매핑해준다. JDBC를 직접 사용할 때 발생하는 여러가지 중복을 제거해주고, 기타 개발자에게 여러가지 편리한 기
데이터 접근 기술에 대해서 더 알아보기 전에 데이터베이스에 연동하는 테스트에 대해서 알아보자. 데이터 접근 기술은 실제 데이터베이스에 접근해서 데이터를 잘 저장하고 조회할 수 있는지 확인하는 것이 필요하다.이렇게 Test 패키지에서 Main의 Application 격인
Mybatis MyBatis는 앞서 설명한 JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper 이다. 기본적으로 JdbcTemplate이 제공하는 대부분의 기능을 제공한다. JdbcTemplate과 비교해서 MyBatis의 가장 매력적인 점은 SQL
메이븐 Qclass 설정하기
중간에서 JpaItemRepositoryV2 가 어댑터 역할을 해준 덕분에 ItemService 가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고 클라이언트인 ItemService 의 코드를 변경하지 않아도 되는 장점이 있었다. (물론 Ite
여기서 맹점은 JDBC 기술을 사용하다가 JPA 기술로 변경하게 되면 트랜잭션을 사용하는 코드도 모두 함께 변경해야 한다.스프링은 이런 문제를 해결하기 위해 트랜잭션 추상화를 제공한다. 트랜잭션을 사용하는 입장에서는 스프링 트랜잭션 추상화를 통해 둘을 동일한 방식으로
@Transactional 을 사용하면 스프링의 트랜잭션 AOP가 적용된다.트랜잭션 AOP는 기본적으로 프록시 방식의 AOP를 사용한다앞서 배운 것 처럼 @Transactional 을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준
옵션들을 요약을 하자면 위와 같다. 트랜잭션을 사용하려면 먼저 스프링 빈에 등록된 어떤 트랜잭션 매니저를 사용할지 알아야 한다. 생각해보면 코드로 직접 트랜잭션을 사용할 때 분명 트랜잭션 매니저를 주입 받아서 사용했다. @Transactional 에서도 트랜잭션 프록시
예외가 발생했는데, 내부에서 예외를 처리하지 못하고, 트랜잭션 범위( @Transactional가 적용된 AOP ) 밖으로 예외를 던지면 어떻게 될까?예외 발생시 스프링 트랜잭션 AOP는 예외의 종류에 따라 트랜잭션을 커밋하거나 롤백한다.언체크 예외인 RuntimeEx
트랜잭션이 둘 이상 있을 때 어떻게 동작하는지 자세히 알아보고, 스프링이 제공하는 트랜잭션 전파(propagation)라는 개념도 알아보자.트랜잭션 전파를 이해하는 과정을 통해서 스프링 트랜잭션의 동작 원리도 더 깊이있게 이해할 수 있을 것이다.DataSourceTra
회원에 대한 변경 이력을 추적할 수 있도록 회원 데이터가 변경될 때 변경 이력을 DB LOG 테이블에 남겨야 한다.jpa 스펙상 빈 생성자 함수는 반드시 있어야한다.DB에 로그를 남기기 위해 도메인을 선언여기 save 부분이 이제 뒤에 test 코드를 작성하며 주로 사
우선 서버단 못지 않게 client 단도 신경써야할 부분이 존재한다.대충 개념은 클라이언트에서 사용자가 보고있는 내역을 엑셀 파일 다운로드 요청 => 해당 내역을 서버에 보냄 =>서버에서는 해당 데이터들을 받아다가 POI-OOXML 라이브러리를 사용하여 편하게 exce
WebSocket 그동안 만들어져 있는 lagacy Websocket 코드를 잘 쓰다가 별도로 내가 구현해야할 일이 있어 알아보니 현재는 꽤 코드가 짧아진 것을 확인할 수 있었다. 이에 예전에 pub/sub 혹은 onOpen, onClose 등 메서드를 직접 구현해서