전체 글
-
스프링 배치(Spring Batch) 스프링 배치란? Spring Batch는 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크이다. 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다. 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다. Spring Batch Meta Data 스프링 배치는 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters 등)의 정보들을 저장, 업데이트, 조회할 수 있는 스키마를 제공한다. 과거, 현재의 실행에 대한 자세한 정보, 실행에 대한 성공과 실패..
[Spring Batch] 스프링 배치 기초, 메타 데이터와 도메인스프링 배치(Spring Batch) 스프링 배치란? Spring Batch는 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크이다. 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다. 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다. Spring Batch Meta Data 스프링 배치는 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters 등)의 정보들을 저장, 업데이트, 조회할 수 있는 스키마를 제공한다. 과거, 현재의 실행에 대한 자세한 정보, 실행에 대한 성공과 실패..
2022.12.13 -
어댑터(Adapter) 패턴 어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 어댑터 패턴을 사용하면 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. 이렇게 되면 클라이언트와 구현된 인터페이스를 분리할 수 있으며, 변경 내역이 어댑터에 캡슐화되기 때문에 나중에 인터페이스가 바뀌더라도 클라이언트를 바꿀 필요가 없다. 아래는 어댑터 패턴의 클래스 다이어그램이다. 예시 다음과 같은 WeatherApi 인터페이스가 있다고 하자. // Target public interface WeatherApi { String getData(); } 모든 날씨 관련 API는 해당 ..
[디자인패턴] 어댑터(Adapter) 패턴어댑터(Adapter) 패턴 어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 어댑터 패턴을 사용하면 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. 이렇게 되면 클라이언트와 구현된 인터페이스를 분리할 수 있으며, 변경 내역이 어댑터에 캡슐화되기 때문에 나중에 인터페이스가 바뀌더라도 클라이언트를 바꿀 필요가 없다. 아래는 어댑터 패턴의 클래스 다이어그램이다. 예시 다음과 같은 WeatherApi 인터페이스가 있다고 하자. // Target public interface WeatherApi { String getData(); } 모든 날씨 관련 API는 해당 ..
2022.12.13 -
마이바티스(MyBatis) MyBatis 공식 사이트 확인 마이바티스(MyBatis)는 SQL을 XML에 편리하게 작성할 수 있는 SQL Mapper이다. 사용 설정 build.gradle에 의존 관계를 추가한다. dependencies { implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' } application.yml에 다음 내용을 추가한다. mybatis: type-aliases-package: com.example.dbaccess.domain configuration: map-underscore-to-camel-case: true mapper-locations: classpath:mapper/**/*.xml log..
[Spring] 마이바티스(MyBatis)마이바티스(MyBatis) MyBatis 공식 사이트 확인 마이바티스(MyBatis)는 SQL을 XML에 편리하게 작성할 수 있는 SQL Mapper이다. 사용 설정 build.gradle에 의존 관계를 추가한다. dependencies { implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' } application.yml에 다음 내용을 추가한다. mybatis: type-aliases-package: com.example.dbaccess.domain configuration: map-underscore-to-camel-case: true mapper-locations: classpath:mapper/**/*.xml log..
2022.12.11 -
반복자(Iterator) 패턴 반복자 패턴은 무엇인가 많이 모여 있을 때 이를 순서대로 가리키며 전체를 검색하고 처리를 반복하는 패턴이다. 반복자 패턴은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 예시 아래와 같은 구조의 Book 클래스가 있다. public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } } 여러 Book 객체를 배열 형식으로 담은 ArrayBookShelf가 있다. public class ArrayBookShelf { private static final int MAX_..
[디자인패턴] 반복자(Iterator) 패턴반복자(Iterator) 패턴 반복자 패턴은 무엇인가 많이 모여 있을 때 이를 순서대로 가리키며 전체를 검색하고 처리를 반복하는 패턴이다. 반복자 패턴은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 예시 아래와 같은 구조의 Book 클래스가 있다. public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } } 여러 Book 객체를 배열 형식으로 담은 ArrayBookShelf가 있다. public class ArrayBookShelf { private static final int MAX_..
2022.12.11 -
프로그래머스 : 부대복귀 (Java) 문제 링크 확인 풀이 최단 거리를 구하는 문제이다. 문제가 어려운 것 같지만 차근차근 읽어보면 생각보다 쉽게 문제를 풀 수 있다. 문제에서 주어진 조건을 정리하자면 다음과 같다. n은 총 지역의 수를 의미한다. roads는 roads[x][2]의 크기로 roads[x][0]과 roads[x][1]은 서로 이어진 경로가 있다는 것을 의미한다. road[x][0]에서 road[x][1]로 경로가 있다는 것은, road[x][1]에서 road[x][0]으로도 이동할 수 있다는 의미이다. 각 지역의 이동 비용은 1이다. sources는 1차원 배열로 부대원들이 각각 출발하는 지역을 의미한다. destination은 부대원들이 도착해야 할 목적지를 말한다. 여기서 중요한 점은..
[프로그래머스] 부대복귀프로그래머스 : 부대복귀 (Java) 문제 링크 확인 풀이 최단 거리를 구하는 문제이다. 문제가 어려운 것 같지만 차근차근 읽어보면 생각보다 쉽게 문제를 풀 수 있다. 문제에서 주어진 조건을 정리하자면 다음과 같다. n은 총 지역의 수를 의미한다. roads는 roads[x][2]의 크기로 roads[x][0]과 roads[x][1]은 서로 이어진 경로가 있다는 것을 의미한다. road[x][0]에서 road[x][1]로 경로가 있다는 것은, road[x][1]에서 road[x][0]으로도 이동할 수 있다는 의미이다. 각 지역의 이동 비용은 1이다. sources는 1차원 배열로 부대원들이 각각 출발하는 지역을 의미한다. destination은 부대원들이 도착해야 할 목적지를 말한다. 여기서 중요한 점은..
2022.12.11 -
JDBC Template JdbcTemplate 공식 메뉴얼 확인 스프링이 제공하는 JdbcTemplate은 JDBC를 편리하게 사용할 수 있게 도와준다. JdbcTemplate은 spring-jdbc 라이브러리에 포함되어 있어 별도의 복잡한 설정 없이 바로 사용할 수 있다. 또한 JdbcTemplate은 템플릿 콜백 패턴을 사용하여 JDBC를 직접 사용할 때 발생하는 커넥션 획득, statement 준비 및 실행, 커넥션 및 statement, resultset 종료, 트랜잭션을 위한 커넥션 동기화, 예외 변환 등 대부분의 반복 작업을 대신 처리해준다. JdbcTemplate을 사용하면 개발자는 SQL 작성, 파라미터 전달, 응답값 매핑만 하면 된다. 의존성 설정 JdbcTemplate을 사용하기 위해..
[Spring] JDBC TemplateJDBC Template JdbcTemplate 공식 메뉴얼 확인 스프링이 제공하는 JdbcTemplate은 JDBC를 편리하게 사용할 수 있게 도와준다. JdbcTemplate은 spring-jdbc 라이브러리에 포함되어 있어 별도의 복잡한 설정 없이 바로 사용할 수 있다. 또한 JdbcTemplate은 템플릿 콜백 패턴을 사용하여 JDBC를 직접 사용할 때 발생하는 커넥션 획득, statement 준비 및 실행, 커넥션 및 statement, resultset 종료, 트랜잭션을 위한 커넥션 동기화, 예외 변환 등 대부분의 반복 작업을 대신 처리해준다. JdbcTemplate을 사용하면 개발자는 SQL 작성, 파라미터 전달, 응답값 매핑만 하면 된다. 의존성 설정 JdbcTemplate을 사용하기 위해..
2022.12.10 -
스프링 초기 DB 스크립트 실행 스프링 애플리케이션 실행 시 초기 테이블 생성 및 데이터 입력이 필요한 경우가 있다. schema.sql 파일과 data.sql 파일을 작성하여 이를 해결할 수 있다. schema.sql : 테이블 생성 스크립트 data.sql : 데이터 입력 스크립트 스프링은 기본적으로 임베디드 DB(h2)일 때 classpath 위치(/src/main/resources)에서 위 스크립트 파일을 읽어서 DB를 초기화 한다. 스프링 application.yml 파일을 통해 위 설정을 커스텀 하여 사용할 수 있다. 아래는 커스텀 한 예시이다. spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb userna..
[Spring] 애플리케이션 실행시 DB 테이블 및 데이터 입력스프링 초기 DB 스크립트 실행 스프링 애플리케이션 실행 시 초기 테이블 생성 및 데이터 입력이 필요한 경우가 있다. schema.sql 파일과 data.sql 파일을 작성하여 이를 해결할 수 있다. schema.sql : 테이블 생성 스크립트 data.sql : 데이터 입력 스크립트 스프링은 기본적으로 임베디드 DB(h2)일 때 classpath 위치(/src/main/resources)에서 위 스크립트 파일을 읽어서 DB를 초기화 한다. 스프링 application.yml 파일을 통해 위 설정을 커스텀 하여 사용할 수 있다. 아래는 커스텀 한 예시이다. spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb userna..
2022.12.10 -
XSS와 CSRF 공격 XSS(Cross-Site-Scripting) 공격 XSS는 Cross-Site-Scripting의 약자로 게시판이나 웹 메일 등에 스크립트 코드를 삽입하여 개발자가 고려하지 않은 기능이 작동하게 하는 공격을 말한다. XSS 공격을 통해 공격자는 다른 이용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 할 수 있다. XSS 공격 유형 XSS 공격은 저장형(stored)과 반사형(reflected)이 존재한다. 저장형은 사용자가 보는 게시물에 악성 스크립트를 삽입하여, 이를 열람할 경우, 공격자의 스크립트가 실행되도록 한다. 공격자는 이를 통해 열람한 유저의 쿠키, 세션 등의 정보를 획득할 수 있다. 반사형은 URL에 스크립트 코드를 작성하는 것이다. ..
[Security] XSS와 CSRF 공격XSS와 CSRF 공격 XSS(Cross-Site-Scripting) 공격 XSS는 Cross-Site-Scripting의 약자로 게시판이나 웹 메일 등에 스크립트 코드를 삽입하여 개발자가 고려하지 않은 기능이 작동하게 하는 공격을 말한다. XSS 공격을 통해 공격자는 다른 이용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 할 수 있다. XSS 공격 유형 XSS 공격은 저장형(stored)과 반사형(reflected)이 존재한다. 저장형은 사용자가 보는 게시물에 악성 스크립트를 삽입하여, 이를 열람할 경우, 공격자의 스크립트가 실행되도록 한다. 공격자는 이를 통해 열람한 유저의 쿠키, 세션 등의 정보를 획득할 수 있다. 반사형은 URL에 스크립트 코드를 작성하는 것이다. ..
2022.12.10 -
도메인 및 서브도메인 연결하기 라즈베리파이로 개인 서버를 구축하고, 이 서버에 젠킨스 및 토이 프로젝트 서버를 띄워 사용하고 있었다. 그런데 매번 ip 주소를 통해 접속하는 것이 번거롭고 URL에 ip 주소가 표시되는 것이 마음에 들지 않았다. 또한 하나의 도메인을 구매해서 여러 서브도메인을 적용하는 방법이 궁금하기도 했고, 추후에 SSL도 적용해서 https 환경으로 배포까지 할 계획이라 이 참에 라즈베리파이 서버에 도메인을 입혀 사용해보기로 했다. 아래 과정에서 개인 도메인을 구매하는 과정은 생략했다. 목표 내가 원하는 도메인 구조는 다음과 같다. www.domain.com : next.js를 이용한 클라이언트 애플리케이션(프론트엔드), port : 3000 api.domain.com : spring..
[Web-Server] 웹 서버에 도메인 및 서브도메인 연결하기도메인 및 서브도메인 연결하기 라즈베리파이로 개인 서버를 구축하고, 이 서버에 젠킨스 및 토이 프로젝트 서버를 띄워 사용하고 있었다. 그런데 매번 ip 주소를 통해 접속하는 것이 번거롭고 URL에 ip 주소가 표시되는 것이 마음에 들지 않았다. 또한 하나의 도메인을 구매해서 여러 서브도메인을 적용하는 방법이 궁금하기도 했고, 추후에 SSL도 적용해서 https 환경으로 배포까지 할 계획이라 이 참에 라즈베리파이 서버에 도메인을 입혀 사용해보기로 했다. 아래 과정에서 개인 도메인을 구매하는 과정은 생략했다. 목표 내가 원하는 도메인 구조는 다음과 같다. www.domain.com : next.js를 이용한 클라이언트 애플리케이션(프론트엔드), port : 3000 api.domain.com : spring..
2022.12.10 -
Docker Volumes 도커는 각 컨테이너마다 독자적인 저장소(Volume)을 가진다. 컨테이너 내부에 저장되는 데이터는 컨테이너가 삭제되었을 경우 함께 사라진다. 이를 보완하기 위해 도커는 데이터의 영속성을 보장하기 위한 여러 방법을 지원하는데, 그 중 하나가 도커 볼륨이다. 볼륨의 종류에는 크게 세 가지가 있다. Bind Mount 호스트 환경의 특정 경로를 컨테이너 내부 볼륨과 연결하여 마운트한다. 디렉토리 경로를 본인의 환경에 맞게 사용할 수 있는 장점이 있으나, 디렉토리 경로가 분산되어 관리가 어려워질 수 있다. 지정한 호스트 디렉토리나 컨테이너 디렉토리가 없으면 자동으로 생성된다. -v [host-directory-path]:[container-mount-path] Volume Docker..
[Docker] Docker VolumeDocker Volumes 도커는 각 컨테이너마다 독자적인 저장소(Volume)을 가진다. 컨테이너 내부에 저장되는 데이터는 컨테이너가 삭제되었을 경우 함께 사라진다. 이를 보완하기 위해 도커는 데이터의 영속성을 보장하기 위한 여러 방법을 지원하는데, 그 중 하나가 도커 볼륨이다. 볼륨의 종류에는 크게 세 가지가 있다. Bind Mount 호스트 환경의 특정 경로를 컨테이너 내부 볼륨과 연결하여 마운트한다. 디렉토리 경로를 본인의 환경에 맞게 사용할 수 있는 장점이 있으나, 디렉토리 경로가 분산되어 관리가 어려워질 수 있다. 지정한 호스트 디렉토리나 컨테이너 디렉토리가 없으면 자동으로 생성된다. -v [host-directory-path]:[container-mount-path] Volume Docker..
2022.12.10