스프링에서는 보통 아래와 같이 스프링 빈을 등록할 수 있다.해당 포스팅은 아래의 강의를 학습 후 정리한 내용입니다.김영한님의스프링기본
스프링에서는 스프링 빈을 생성하고 스프링 컨테이너에 등록하는 과정과 스프링 의존 관계(연관 관계)를 설정해주는 스텝이 존재한다고 한다.물론 의존 관계도 스프링에서 자동으로 설정해 줄 수 있었다.의존관계 자동 주입의 핵심은 @Autowired 라는 어노테이션이다.의존
스프링빈은 스프링에서 자체적으로 등록해주는 빈들도 있고, 개발자가 다형성을 이용해서 동일한 타입의 여러 구체 클래스를 스프링빈으로 등록해서 사용할 수 있다.다음과 같은 상황이 있다고 가정해보자.OrderRepository 라는 인터페이스가 존재한다.OrderReposi
스프링 빈은 아래와 절차로 라이플 사이클을 갖는다고 한다.스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료생각해보면 C++에서 프로젝트를 할때 객체의 생성자에서 온갖 일을 많이 처리했었던 기억
스프링 빈은 여러가지 Scope를 갖고 있어서 각각의 Scope 마다 라이프 사이클을 달리 한다고 한다.기본값으로는 모두가 일반적으로 알 고 있는 singleton 방식으로 관리되는 Scope로 사용된다.하지만, singleton 이외에도 여러 가지 Scope가 더 있
uri 설계시에 가장 중요한것은 리소스 식별이라고 한다!여기에서 말하고 있는 리소스는 특정 행위가 아닌 명사를 의미한다.만약, 회원가입이라는 기능이 있다며 가입이라는 액션이 아닌 회원이라는 명사만 리소스가 된다.그런데 왜 리소스 식별이 중요한걸까?왜냐하면 URI의 의미
Spring Http 상태 코드 Http 상태코드는 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능이라고 한다. 상태 코드에는 여러 종류가 존재하는데 간략히 정리하면 아래와 같다. 1xx(Information) : 요청이 수신되어 처리중(거의 안씀)
일반적으로 알고 있듯이 캐시가 존재하면 사용자의 경험이 개선된다.캐시를 적용하려면 Http Request Header에 값을 넣어줘야한다.cache-control:max-age=60 -> 60초간 유효하다고 지정웹브라우저는 캐시를 저장하는 공간이 별도로 존재한다.만약
Spring 서블릿 서블릿은 WAS 서버에서 우리(개발자)가 중요한 비지니스 로직에만 집중할 수 있도록 지원해주는 도구라고 할 수 있다. 만약 서블릿이 없다면 Http Request 데이터의 파싱부터 TCP/IP 연결까지 모든걸 구현해야한다. (매우 안타까운일이다.
주로 API 서버를 만들어서 사용하다 보면 Json 포맷으로 데이터를 주고 받게 된다.그렇다면 Json을 그대로 사용하지 않고, 객체에 매핑해서 사용한다.하지만, Json을 파싱해서 사용하면 매우 불편할것이다.그래서 스프링(자바)에서는 Json을 문자열로 사용하지 않고
mvc 패턴은 서블릿이나 JSP 내부에서 처리하던 모든 로직을 Controller와 View라는 영역으로 역할을 나누는것을 말한다.컨트롤러 : HTTP 요청을 받아서 파라미터를 검증하고 비지니스 로직을 실행합니다.그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담습니
스프링 MVC에서의 프론트 컨트롤러를 DispatcherServlet이라고 부른다.프론트 컨트롤러의 역할을 다시 한번 생각해보면 이랬다.서블릿 하나로 클라이언트의 요청을 통일함프론트 컨트롤러가 요청에 맞는 컨트롤러(핸들러)를 찾아 호출해줌각 컨트롤러(핸들러)에서 필요한
Spring Spring MVC 스프링은 애노테이션 기반의 컨트롤러를 만드는데 @RequestMapping 애노테이션을 사용한다. @RequestMapping 애노테이션이 있으면 RequestMappingHandlerMapping, RequestMappingHand
war 패키징과는 달리 jar 패키징을 사용하게 되면 /resources/static/index.html 위치에 index.html을 두면 welcome page로 처리해준다. war 패키징을 사용하면 webapps 하위 경로를 사용했었다.@Controller 애노테이
@Controller 애노테이션을 이용해서 RequestMappingHandler를 만들게 되면 자동으로 컴포넌트스캔에 의해서 자동으로 스프링빈에 등록되어서 RequestMappingHandler와 RequestMappingHandlerAdapter에 의해서 컨트롤러가
PRG는 Post Redirect Get 의 줄임말로서, 실무에서 자주 발생하는 문제를 해결하는 방식을 일컫는다고 한다.즉, Post로 남겨두는게 아니라 Redirect으로 Get Method로 바꿔놓으라는 의미가 된다.왜 Post로 남겨두면 안될까?그 이유는 Post
스프링은 이러한 메시지 관리와 국제화 기능을 모두 제공한다.하드코딩된 메시지(TW)를 특정 파일에서 일관되게 관리하도록 하는것을 말한다.(messages.properties)왜 이렇게 관리해야하냐면... 만약 특정 화면의 제목을 변경해야하는 경우, 이 제목은 소스 코드
Spring에서는 BindingResult 객체를 이용해서 검증 오류를 보관하는 기능을 제공한다.즉, Controller에서 특정 객체에 대해서 검증 오류가 발생하면 BindingResult객체에 담기게 된다.BindingResult의 간단한 사용 예시는 아래와 같다.
Spring에서는 객체에 대해서 Validation을 수행하는 매우 편리한 방법을 제공한다.이전 포스팅에서는 BindingResult와 Validator, 그리고 @Validated 애노테이션을 사용한 Validation 방식을 공부했었다.이전 포스팅 : Spring에
로그인 상태를 유지하기 위해서는 쿠키를 사용할 수 있다.쿠키를 사용하지 않는다면 로그인 정보를 매번 Request Parameter로 전달해야한다.특히, 쿠키의 종류는 영속 쿠키와 세션 쿠키가 있다고 한다.영속 쿠키 : 만료 날짜를 입력 하면 해당 날짜까지 유지세션 쿠
스프링에서는 웹과 관련된 공통 관심 사항을 처리할 수 있도록 지원하는 서블릿 필터와 스프링 인터셉터 기술이 존재한다고 한다. AOP를 사용해도 되지만 웹과 관련된 공통 관심 사항에서는 Http 헤더나 Url 정보 등이 필요하기 때문에 필터나 인터셉터를 사용하게 좋다고
서블릿에서는 2가지 방식으로 예외를 처리한다고 한다.Exception(예외)response.sendError(Http 상태코드, 오류 메시지)웹 애플리케이션은 사용자 요청 별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다.만약 try-catch로 예외를
customize 오버라이드하는것!! html이 아닌 json을 반환해야함. produces = 설정으로 지정함! produce는 클라이언트가 보낸 accept에 따라서 별도로 호출됨. 즉 우선순위를 갖음. Accept는 클라이언트가 받을 수 있는 데이터 타입을
API 서버가 아닌 웹서버는 요청에 대한 결과로서 Html 페이지를 전달한다.따라서, 이전에 예외가 발생한 경우 특정 오류 페이지를 클라이언트에게 전달해주는 과정을 공부했다.그렇다면 API서버라면 어떨까?Html 페이지를 전달하는게 올바른 방법일까? 당연히아니다.API
Spring에서는 @RequestParam 애노테이션을 사용해서 전달된 파라미터를 파싱해서 사용할때 아래와 같이 사용이 가능하다.즉, text(String)으로 전달된 값을 자동으로 Integer로 타입 변환해서 받을 수가 있다.이게 가능한 이유는 스프링이 중간에 타입
일반적인 form형식(Content-Type: application/x-www-form-urlencoded) 으로는 바이너리를 전달이 불가능하다.따라서 이러한 문제를 해결하기 위해서는 아래의 타입을 사용해야한다.multipart/form-datamethod="post"
초창기의 애플리케이션과 데이터베이스를 연결해서 사용하기 위해서는 데이터베이스마다 커넥션 연결, SQL을 전달하는 방법, 그리고 그 결과를 응답받는 방법이 모두 달랐다고 한다.따라서 여기에는 큰 문제 2가지가 있었다.데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플
데이터베이스의 커넥션을 획득할때는 아래와 같은 복잡한 과정이 필요하다.1) 애플리케이션 로직에서 DB 드라이버를 통해 커넥션을 조회한다.2) DB드라이버는 DB와 TCP/IP 커넥션을 연결한다.(TCP/IP 연결을 위한 네트워크 동작 발생)3) DB 드라이버는 TCP/
Spring 트랜잭션 트랜잭션 자동 커밋, 수동 커밋 DB 락 DB 락 변경 DB 락 조회 참고 해당포스팅은 아래의 강의를 공부하여 정리한 내용입니다. 김영한님의 SpringDB1-트랜잭션
Spring 애플리케이션 구조 기존 코드의 문제점 트랜잭션 추상화 스프링에서의 트랜잭션 추상화 트랜잭션 동기화 이전 코드에서는 파라미터를 이용해서 동기화함. 트랜잭션 매니저 datasourceutilmanager() 트랜잭션매니저가 알아서 release함수의
자바는 기본적으로 아래의 그림과 같은 예외 계층을 갖는다.Object : 예외도 객체이므로 모든 객체의 최상위 부모는 Object이므로 예외의 최상위 부모도 Object이다.Throwable : 최상위 예외이다. 하위에 Exception과 Error가 있다Error :
jdbcTemplate에서 특정 객체로 반환하기 위해서는 맵핑 정보를 넣어줘야함. 그게 RowMapper임 자세한 내용은 db2 강의에서 설명함.
프로젝트를 진행하다가 보면 Spring에서 EventListener 애노테이션을 볼 수 있다.실제 김영한님의 강의에서는 아래와 같은 애노테이션이 사용되었다.@EventListener(ApplicationReadtEvent.Class) 라는 애노테이션이 사용되었다.@Ev
Spring JDBCTemplate JdbcTemplate는 spring-jdbc 라이브러리에 포함되어있다. 이 라이브러리는 스프링으로 JDBC를 사용할떄 기본으로 사용되는 라이브러리이다. 그리고 별도의 복잡한 설정 없이 바로 사용할 수 있다. JdbcTemplat
Spring 테스트 - 데이터베이스 연동 @SpringBootTest 이게 있으면 상위 패키지에서 @SpringBootApplication을 찾아서 동일한 설정을 사용함. ex) @ Import(XXX) 테스트 - 데이터베이스 분리 테스트 - 데이터 롤백 테스
Spring MyBatis 여러줄 쿼리를 작성할떄 공백에서 주의하지 않아도됨 MyBatis 설정 MyBatis는 라이브러리에 버전이 붙는다. 공식적으로 관리하지 않기 떄문이다. 그래서 버전정보를 별도로 추가해줘야함. springboot-start-xxx 이런건
@Repository가 붙은 객체는 컴포넌트 스캔의 대상일뿐만 아니라 추가 기능을 제공한다. @Repository 가 붙은 클래스는 컴포넌트 스캔의 대상이 된다. @Repository 가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다. @Controller는
Spring 스프링 트랜잭션 추상화 각각의 데이터 접근 기술들은 트랜잭션을 처리하는 방식에 차이가 있다. 예를 들어, JDBC기수로가 JPA기술은 트랜잭션을 사용하는 코드자체가 다르다. 따라서, JDBC기술을 사용하다가 JPA 기술로 변경하게 되면 트랜잭션을 사용하
Spring 스프링 트랜잭션 전파1 - 커밋, 롤백 스프링 트랜잭션 두번 사용 스프링 트랜잭션 전파 기본 스프링 트랜잭션 전파 - 예제 스프링 트랜잭션 전파 - 외부 롤백 스프링 트랜잭션 전파 -내부 롤백 스프링 트랜잭션 전파 - REQUIRES_NEW 스프
Spring ThreadLocal ThreadLocal 주의 사항 참고 해당 포스팅은 아래의
Spring 템플릿 메서드 패턴 제네릭은 Void라는객체타입을 넣어줘야함. (완료) 전략 패턴 완료 템플릿 콜백 패턴 강의 들어야함. 참고 해당 포스팅은 아래의 강의를 공부하여 정리한 내용입니다. 김영한님의 템플릿메서드패턴
Spring(집가서) 스프링빈 등록 예제 3가지 스프링빈을 등록하는 3가지 방법은 모두 실무에서 자주 사용된다. 인터페이스와 구현 클래스 - 스프링빈 수동 등록 아래의 코드는 인터페이스와 그 구현 클래스들을 스프링빈에 수동 등록하는 방법이다. 스프링은 @Contr
Spring 리플렉션 프록시를 사용해서 기존 코드를 변경하지 않고 로그 추적기라는 부가 기능을 적용할 수 있었다. 그런데 문제는 대상 클래스의 수만큼 로그 추적을 위한 프록시 클래스를 만들어야 한다는 점이다. 로그 추적을 위한 프록시 클래스들의 소스 코드는 거의 같은
Spring 프록시 팩토리 CGLIB와 JDK 동적 프록시를 사용하는 경우 아래와 같은 문제점들이 있었다. >문제점 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면 어떻게 해야할까? 두 기술을 함께 사용할 때
Spring 빈후처리기 빈후처리기 - 예제 AnnotationConfigApplicationContext자체가 스프링컨테이너라고 이해해도무방 BeanPostProcessor를 구현하고 스프링빈으로 등록하면 알아서 구현내용에 따라서 후킹함. 빈이름이랑 빈 객체를
스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. 자동 프록시 생성기는 스프링빈으로 등록된 어드바
Spring AOP 소개 - 핵심 기능과 부가 기능 AOP 소개 - 애스펙트 스프링도 AOP를 지원함. 프록시 방식으로 만들었던것. AOP 적용 방식 컴파일,클래스로더타임 잘안씀, 런타임 시점 사용함. 조인포인트 : 프록시를 적용할수 있는 지점 AOP 용어 정
Spring Spring AOP 구현 Before에서는 JoinPoint를 써야함. Before에서는 jointpoint 실행까지해줌. around는 jointproceedJoinPoint를 무조건 써줘야함. 참고 해당 포스팅은 아래의 강의를 학습한 정리한 내용입
Spring 포인트컷과 포인트컷 지시자 애노테이션을 만들때, Target을 Type으로 하면 클래스를 지정하고, RetentionPolicy.Rutime은 실행시간동안 계속 살아있음을 의미. 선언타입은 패키지와 클래스명을 의미함. this는 object가 넘어온다
Spring 프록시와 내부 호출 - 문제 프록시와 내부 호출 - 대안1 자기자신 주입 프록시와 내부 호출 - 대안2 지연 조회 프록시와 내부 호출 - 대안3 구조 변경 프록시 기술과 한계 - 타입 캐스팅 proxyFactory.setProxyTargetCla
Spring 메시지 컨버터
이전 포스팅( Bean Validation )에서 Bean Validation에 대해서 정리를 했었다.근데... ModelAndView 방식의 Controller와 아니라 API Controller인 경우 Bean Validation 동작후 에러 메시지를 제대로 가져오
오늘은 VO(Value Object) 객체에 대해서 정리릏 해보려고 한다.VO에 대해서 검색을 해보면 VO, DTO, Entity에 대해서 여러 정리글들이 나온다.이번 포스팅의 목적은 VO 객체가 무엇이고, DTO, Entity와의 차이점은 무엇인지 내가! 공부하기 위
회사에서 scheduler를 구현할 일이 생겨서 토비 책을 펼쳐보았다.펼쳐서 공부한 김에 한번 정리해보자.TaskExecutor와 TaskSchduler에서 말하는 Task는 java.lang.Runnable의 run()이라는 메소드를 가진 인터페이스를 구현한 독립적인
OpenAPI를 호출하기 위한 여러 도구를 찾다가 WebClient 까지 오게 됐다.그런데.. WebClient, RestTemplate, RestClient 등등 헷갈리는게 생각보다 많았다.찾아본걸 정리하지 않으면 잊어버릴것같아서 포스팅으로 정리하려고 한다.WebCl
jaspyt 참고 https://medium.com/@byeongsoon94/spring-boot-yaml-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EC%95%94%ED%98%B8%ED%99%94%EC%99%80-jasypt-passwod-%EB%85%B8
Swagger 오늘은 토이프로젝트에 swagger를 적용해보려고 한다. swagger를 적용하는 이유는 구글링 해보면 여러 가지 이유들이 있다. API 명세 자동화 API 테스트 나 같은 경우 토이 프로젝트이기 때문에 매번 postman이 아닌 swagger를 이용
Pub/Sub 기능은 Kafka, RabbitMQ, Redis를 이용해서 구현할 수 있다.그런데, 어떤 상황에서 kafka, RabbitMQ, Redis를 사용해야하는걸까?이번 포스팅에서는 Redis를 이용한 Pub/Sub을 구현해보고, 잘 알려진 Redis Pub/S
이전 포스팅에서 간단한 Redis를 이용한 Pub/Sub 예제를 구현해보았는데, 오늘은 Kafka를 이용한 간단한 Pub/Sub을 구현해보려고 한다.이 포스팅에서는 Kafka에 대한 자세한 설명은 하지 않고, 간단한 설명만 적어놓으려고 한다.Kafka는 기본적으로 프로