본문 바로가기

SpringFramework/Spring

(18)
Spring - PSA PSA(Portable Service Abstraction) : 환경의 변화와 관계없이 일관된 방식의 기술 접근 환경을 제공하려는 추상화 구조. 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 추상화(Service Abstraction)라고 한다. (이하 추상화) - 하나의 추상화로 여러 서비스를 묶어둔 것을 PSA(Portable Service Abstraction)이라고 한다. - Spring의 대표적인 핵심가치 3가지(Ioc, AOP, PSA)중 하나의 개념이다. => Ioc와 AOP 정리내용 확인: https://xggames.tistory.com/13 - Spring은 다양한 기술에 추상화(Service Abstraction)을 제공하고 있다. Web MVC..
Spring - 스케줄러 중복실행 이슈분석 Spring 프레임워크에는 linux에서 제공하는 배치(일정주기 혹은 특정시간에 자동실행)와 같은 라이브러리를 제공한다. 이를 스프링 스케줄러라고 한다. 배치프로그램은 실무에서 필수적으로 굉장히 많이 쓰이며 스프링에서는 간단하게부터 시작해서 스프링 배치 프레임워크와 연계하여 안정적인 대용량처리 프로그램을 작성할 수 있다. (스케줄러와 스프링 배치는 같은 개념이 아니다! 스케줄러로 스프링 배치를 수행한다) 스프링 스케줄러 Spring 프레임워크 (spring-boot-starter) 내에 기본적으로 포함되어있으므로 의존성 추가는 필요하지 않다. (Quarts를 사용하는 경우에는 의존성추가 필요. 하지만 이번 글에서는 다루지 않는다) 기본적인 사용방법이다. import net.javacrumbs.shedlo..
Spring - Mybatis 샵(#)과 달러($)의 차이 Mybatis 프레임워크를 사용할 때 XML파일에 쿼리문을 작성한다. 그리고 쿼리문을 작성할때 필요 인자들을 보내주고, 쿼리 바인딩을 사용하여 인자들을 매핑한다. 매핑을 할 때 샵(#)과 달러($)를 사용하는데, 두개의 차이는 무엇일까? SELECT user_id, user_name, user_age, user_email, user_phone FROM users WHERE user_name = #{user_name} SELECT user_id, user_name, user_age, user_email, user_phone FROM users WHERE user_name = ${user_name} 샵(#)으로 쿼리바인딩 파라미터가 String 형태로 들어와 자동적으로 싱글쿼터가 붙어서 [user_name ..
Spring - Mybatis FrameWork 여러 스키마 적용하기 MyBatis FrameWork 개념 및 설정 Spring - Mybatis FrameWork 개념 및 설정 MyBatis란? : 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다. Hibernate나 JPA처럼 새로운 DB프로그래밍 패러다임을 익혀야하는 부담 없이 SQL 쿼리를 그대로 사용한다. 따라 xggames.tistory.com Spring의 Mybatis에서 기본적으로 DataBase 설정 및 주요 컴포넌트의 역할에 대해서 알아본 적이 있다. 그렇다면 스키마가 여러개인 경우에는 어떻게 설정해야할까? application.yml spring: my-lab-db1: datasource: jdbc-url: jdbc:mysql://localhost:3306/my_lab_db..
Spring - 인스턴스 변수 참조 스프링 프레임워크는 필요한 클래스를 의존주입(Dependency Injection)하여 사용한다. 이때 주입하여 생성된 객체는 싱글톤으로 생성되어 스프링 컨테이너에서 한번 생성하여 관리한다. 싱글톤 Bean은 스프링 컨테이너에서 한번 생성된다. (컨테이너가 사라질 때 Bean도 제거된다) 생성된 하나의 인스턴스는 Single-Beans-Cache에 저장되고, 해당 Bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환한다. 즉, 하나만 생성되기 때문에 동일한 것을 참조한다. 기본적으로 모든 Bean은 Scope이 명시적으로 지정되지 않는다면, Singleton이다. 단, ProtoType으로 빈이 생성된다면, 다수의 객체로써 존재하게 된다 이슈상황 코드 확인 controller package com.t..
Spring - Redis 연동 Redis Java Client중 "Lettuce"를 사용하여 진행한다. 의존성 추가 compile 'org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE' // Redis Redis 외부설정 Properties (application.yml) 변수 기본값 설명 spring.redis.database 0 커넥션 팩토리에 사용되는 데이터베이스 인덱스 spring.redis.host localhost 레디스 서버 호스트 spring.redis.password 레디스 서버 로그인 패스워드 spring.redis.pool.max-active 8 pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한) spring.redis.pool...
Spring - Validation Spring에서는, Validation Annotation으로 Request Form에대한 요청이나, Parameter, Bean Class와 같은 여러가지 필드에 대하여 길이제한, 필수값 등.. 유효성 check를 할 수 있다. 의존성 추가 dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' // 유효성검사 implementation 'org.springframework.boot:spring-boot-starter-web' } Validation관련 주요 어노테이션 설명 @Min(value=*): value에 입력된 수치보다 크거나 같아야 한다 @Max(value=*): value에 입력된 수치보다..
Spring - ErrorController Spring Boot Application을 만들면서, 404 Page Not Found에 대한 처리를 커스텀해야할 상황이 생겼다. 스프링에서는 기본적으로 에러처리를 아래와 같은 방법으로 처리해준다. (링크 1.기본적인 에러 처리 참고) [스프링부트 (12)] SpringBoot 에러 페이지 설정(Custom Error Page) [스프링부트 (12)] SpringBoot 에러 페이지 설정(Custom Error Page) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Spring Boot Custom Error Page ] 입니다. : ) 0. 에러 페이지를 만들기 앞서 개발.. goddaehee.tistory.com 링크 내용에서도 언급했듯이, BasicErrorController라는 곳에서 기본적인..
Spring - Filter, InterCeptor, AOP 1] Filter 2] InterCeptor 3] AOP 이 세가지 기능은 비슷한 역할을 한다. 이들을 작업할 때 공통되는 부분을 중복코드를 방지하기 위해 묶어주는 역할을 한다. 이 기능들은 Spring에서 제공해준다. 그렇다면, 차이점은 어디에 있을까? 흐름은 아래 그림과 같다. 차이점은 실행하는 위치가 다르다. 흐름: Filter -> InterCeptor -> AOP -> InterCeptor -> Filter Filter Filter는 Servlet이 실행되는 동안에 Init가 실행되고, doFilter가 실행된다. [인코딩 변환 처리, XSS방어 등의 요청에 대한 처리부에 주로 사용] // Filter 예제코드. Filter 인터페이스를 오버라이딩하여 구현한다. import javax.servl..
Spring - Log4j2 log4j2, logback과 같은 로깅시스템은 왜사용할까?? 자바에서는 출력을 System.out으로도 할 수 있는데 문제는 운영이다. 개발시에 개발자가 출력한 System.out구문을 모두 제거하지 않았다면 운영시에 계속 로그가 출력되고 이것은 리소스 낭비를 초래한다. 그렇다고 개발자가 배포시에 모두 찾아서 지우는것 또한 일이다. 또한 운영시에 중대한 오류가 발생하였다고 했을때, 출력되는 로그가 없다고하면 그것 또한 문제를 찾기 위해 엄청난 시간과 노력이 들어간다. 이처럼 운영상에 로그를 남기지 않고 개발시에만 로그를 남김으로써 리소스 낭비를 줄일 수 있고 필요시에는 로그를 남겨서 오류 추적시에 사용될 수 있다. log4j의 프로젝트는 이미 종료되었고 추가적인 업데이트가 이루어지지 않는다. 현재는 l..