-
[Spring] Spring Batch의 이해와 5.0에서 기본 테스트 구현
다음은 배치를 사용하여 본격적인 서비스를 구현하기 전에 기본적인 이론과 5.0에서의 테스트를 미리 진행해보는 것을 목표로 한다. Spring Batch란? Batch는 대규모 데이터를 처리하거나, 일괄 처리 작업을 지원하는 Spring Framework의 하위 프로젝트 이다. Batch를 이용해서 대규모 데이터 처리가 가능한 이유는, chunk 단위로 트랜잭션을 처리하기 때문인데, @Transactional을 사용해보았다면 이해가 쉬울 것이다. @Transactional을 가진 메서드를 호출할 때 프록시 객체(데이터베이스에 조회를 지연할 수 있는 가짜 객체)가 생성된다. 그리고 이떄 생성된 프록시 객... Read More
-
[Spring] SNS 로그인 구현 및 DB 자동 암호화
서블릿에 필터를 추가함으로서 서블릿 필터와 서블렛 필터의 등록 방법을 익히는 걸 목표로 한다. SecurityConfig Spring Security의 기본적인 디폴트 페이지를 사용. 따라서 oauth2login은 별도로 진행한다. Oauth2Login 위의 코드에서 람다식이 사용 가능한 이유는 다음과 같다. 람다식 안의 oauth는 OAuth2LoginConfiguer이다. 즉, 앞서 해당 글에서 설명한 것처럼 람다식으로 Customizer를 대체함으로서 oauth2 로그인 과정의 일부를 커스텀 할 수 있다. 현재 코드에서는 유저가 로그인 작업을 성공적으로 마친 뒤의 과정을 커스텀할 수 있다. Oa... Read More
-
[Java] 서블릿 필터와 서블릿 필터체인
서블릿에 필터를 추가함으로서 서블릿 필터와 서블렛 필터의 등록 방법을 익히는 걸 목표로 한다. 서블릿 필터 서블릿 필터란 서블릿에 들어오기 전에, client로 부터 온 요청을 필터링 하는 것을 말한다. 인증(사용자 인증) 필터 로깅 및 감시(Audit) 필터 이미지 변환 및 데이터 압축 필터 암호화 필터 XML 컨텐츠를 변형하는 XSLT 필터 URL 및 기타 정보들을 캐싱하는 필터 와 같은 것들을 필터를 통해 구성하는데, 구현하기 위해서는 아래의 예시와 같이 Filter 인터페이스를 상속받아 ... Read More
-
[Java] 람다식을 통해 함수형 인터페이스 구현하기
일반적인 방법. 인터페이스를 작성한다. 인터페이스를 상속받는 class를 만들어 인터페이스에 정의된 메서드를 오버라이드 한다. 함수형 인터페이스 또한 professor의 경우 단 한번 만 사용되기에 클래스를 만들지 않고 익명 객체로 선언할 수 있다. 람다식 람다식은 근본적으로 함수형 인터페이스의 인스턴스를 생성하는 방식으로 작동한다. 이때 인스턴스의 경우 컴파일시 정의된 방법대로 생성된다. 매개변수, 반환값이 일치하면 익명 객체를 대체 할 수 있다는 람다식의 특징을 활용하면 보다 짧게 구현할 수 있는데, 다음과 같다. 실제로 언제 사용할까? 다음은 스프링에서 U... Read More
-
[Spring] DelegatingFilterProxy와 FilterChainProxy
DelegatingFilterProxy와 FilterChainProxy가 무엇인지 설명하기 위해 다음의 작업을 거친다. 서블릿 필터 서블렛 컨테이너 DelegatingFilterProxy FilterChainProxy 서블릿 필터 서블릿 필터는 ServletDispatcher에 도달하기 전 데이터를 알맞게 가공하고, 공통의 관심사를 처리하는 역할을 한다. (java Servlet Filter is used to intercept the client request and do some pre-processing.) 이를 통해 서블릿에서 인증(Authenticatio... Read More
-
[백준] 내려가기
https://www.acmicpc.net/problem/2096 문제 N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다. 먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다. 별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음... Read More
-
[백준] 내려가기
https://www.acmicpc.net/problem/2096 문제 N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다. 먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다. 별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음... Read More
-
[백준] 야구
https://www.acmicpc.net/problem/17281 문제 ⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종료되고, 두 팀이 공격과 수비를 서로 바꾼다. 두 팀은 경기가 시작하기 전까지 타순(타자가 타석에 서는 순서)을 정해야 하고, 경기 중에는 타순을 변경할 수 없다. 9번 타자까지 공을 쳤는데 3아웃이 발생하지 않은 상태면 이닝은 끝나지 않고, 1번 타자가 다시 타석에 선다. 타순은 이닝이 변경되어도 순서를 유지해야 한다. 예를 들어, 2이닝에 ... Read More
-
[백준] 플로이드
https://www.acmicpc.net/problem/11404 문제 n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 ... Read More
-
[백준]친구 네크워크
https://www.acmicpc.net/problem/4195 문제 민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다. 어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오. 친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친... Read More
-
페이징 구현-2
지난 번과 마찬가지로 Page와 Pageable,queryDSL을 사용하는 것을 전제로 한다. 페이징을 적용할 부분은 이용권 전체조회 API, 예약 전체조회 API 부분이다. 개발 순서 예약 조회의 경우 예약 완료가 된 상태만 가져오는 것이 필요하다. 이를 위해 booking테이블에 예약 완료 상태를 알 수 있는 Column을 하나 만든 후, @index를 통해 검색기능을 활성화 하는 것이 필요해 보인다. 이용권 전체 조회 시에 정렬 기준은 started_day를 기준으로 한다 앞서 페이징 구현-1 과 마찬가지로 현재 페이지의 위치와 전체 페이지 수에 대한 코드를 분리하자. 이용권 전체 ... Read More
-
페이징 구현-1
보다 쉬운 페이징 구현을 위해 queryDSL을 사용한다. SpringFramwork에서 제공하는 Page와 Pageable을 이용한다. 개발 순서 repository에서 Page형식으로 서비스에 리턴 하도록 만드는 것이 우선으로 보인다. Keword와 페이징방식(Pageable)이 주어지면 해당 방식에 맞게 리턴할 수 있도록 만들 예정. 서비스의 경우 가져온 데이터를 dto로 변환해 return하는 과정이 필요해보인다. 컨트롤러의 경우 현재 페이지의 위치와 전체 페이지 수를 알 수 있어야 한다. 이 코드를 분리하기 위해 페이징으로 ... Read More
-
1.스프링의 제어역전
@Autowired는 스프링 컨테이너(스프링에서 자바 객체들을 관리하는 공간)에서 생성된 Spring Bean을 원하는 곳에 주입해주는 어노테이션으로, @Autowired가 무엇인지 알기 위해서는 Spring bean과 의존성 주입이란 무엇인지 알아야한다. @SpringBean 보다 쉬운 이해를 위해 ‘A’라는 클래스는 유저를 찾는 기능(ex:findById)이 필요하며, UserRepositroy에 해당 기능이 있다고 가정해보자. private final UserRepository userRepository = new UserRepository(); ‘A’ 클래스는 UserRepositroy에 있는 ... Read More
-
마크다운 적용 테스트
링크 달기 input: \[markdown\]\(링크\) output: markdown 볼드텍스트 input: **볼드 텍스트** output: 볼드 텍스트 헤딩 input: ## 헤딩 쓸모없는 테이블 만들기 | Number | Next number | Previous number | | :------ |:--- | :--- | | Five | Six | Four | | Ten | Eleven | Nine | | Seven | Eight | Six | | Two | Three | One | Number Next number ... Read More
-
Table 예시
Table example as below For now, these extended features are provided: Cells spanning multiple columns Cells spanning multiple rows Cells text align separately Table header not required Grouped table header rows or data rows Rowspan and Colspan ^^ in a cell indicates it should be merged with the cell above. This feature is contribu... Read More
-
마크다운 포스팅 참고 문서
This note demonstrates some of what Markdown is capable of doing. An exhibit of Markdown Note: Feel free to play with this page. Unlike regular notes, this doesn’t automatically save itself. Basic formatting Paragraphs can be written like so. A paragraph is the basic block of Markdown. A paragraph is what text will turn into when there is no... Read More
-
Entity를 리펙토링 하게 된 이유
mysql을 공부하다보니, 현재 관계형 데이터베이스의 이점을 제대로 살리지 못하고 있다는 것을 깨달았다. 따라서 리펙토링 과정을 거치며 entity를 조금 수정하려 한다. 재설계 할 부분은 다음과 같다. 유저가 쓴 글에 대한 검색 서비스를 위해, user와 posts 사이의 연관관계 매핑이 필요하다. entity 생성자가 public으로 열려있다. @builder 를 사용하거나 메서드로 한 번 감싸는 과정이 필요해보인다. 현재 entity의 id는 자동생성이다. 이때, userId.set이 가능한 것은 좋지 않아보인다. 필수 값들에 대한... Read More
-
2.스프링 컨테이너와 AppConfig
스프링 컨테이너의 역할은 무엇인가? 스프링 컨테이너는 @Configuration이 붙은 Config의 정보를 사용한다. 이때 스프링 컨테이너는 해당 클래스 내부에 @Bean이 붙은 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 그리고 그것을 우리는 스프링 빈이라고 부른다. 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. 이때 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다. 다음과 같이 컨테이너를 생성했을 때를 가정해보자. AnnotationConfigApplicationContext ac... Read More
-
Entity 와 DTO
DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체이다. 즉, DTO를 사용하면서 생기는 이점 = 계층 별로 객체를 나누었기 때문에 생기는 이점이다. DTO의 이점? 요청에 대한 응답에 필요한 데이터를 모으기 위해 여러 컨트롤러를 돌며 DB를 여러번 왔다 갔다 하기 보다는 데이터베이스의 필요한 데이터를 한번에 요청한 뒤 처리하는 것을 가능하게 만들 수 있다. DTO를 적용하지 않는다면, 불필요한 데이터가 다른 계층으로 올라올 수 있다.(ex: 유저의 아이디만 필요한데 비밀번호까지 browser에 노출 되는 경우) DTO를 코드에 적용하기 위해서 거쳐야 하... Read More
-
필터-1
스프링 공식 문서를 따라 가며 작성하였습니다. 1. Filter와 FilterChain Spring Security는 서블렛 필터를 기반으로 하기에 servlet container에서 작동한다. 이때 든 의문점은 다음과 같다. security config를 작성하다 보면 servlet container에서 작동한다기엔 애매한 영역들이 많다.(ex bean,repository 등) 어떻게 작동한다는 것일까? servlet container와 ioc 컨테이너는 서로 다른 영역이 아니었나? 이에 대한 설명은 바로 밑인 DelegatingFilterProxy에서 볼 수 있다. DelegatingFi... Read More
-
Swagger를 사용과 css 적용 에러
swagger로 api 문서를 관리하면서 다음과 같은 문제가 발생했다. 여기서 ** net::ERR_ABORTED 404**는 해당 주소에 정적파일이 존재하지 않았기에 일어난 것으로 보인다. Swagger가 해당 문제를 일으키는지 확인하기 전에, 다음의 상황을 체크해보자. spring security는 정적 리소스 또한 인증을 필요로 한다. 이를 해결 했는지 확인해보자. @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().antMatchers("... Read More
-
필터-2
이전 글에서, DelegatingFilterProxy 내에는 Bean이 존재하며 이 bean을 FilterChainProxy라고 한다는 것을 알 수 있엇다. 이번 글에선 Bean 내부에서 실행되는 security filter에 대해 자세히 알아보고자 한다. SecurityFilterChain 내부 Filter의 순서 공식 문서에 따르면 다음과 같은 순서로 필터가 작동한다. 필터에 대해 자세히 설명하기 전에, 각 필터의 대략적인 역할은 다음과 같다. CsrfFilter : Csrf에 대한 기본적인 보호기능을 제공한다. Spring Security는 기본적인 CSRF 공격은 알아서 보호 하므로 추가... Read More
-
배너 비디오 추가 예시
def print_hi(name) puts "Hi, #{name}" end print_hi('Tom') #=> prints 'Hi, Tom' to STDOUT. 링크 별도 첨부 예시 Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk. #include <iostream> using namespace std; ... Read More
-
Plantuml 예시
My First PlantUML PlantUML Block-1 @startuml Bob -> Alice : hello @enduml PlantUML Block-2 Bob -> Alice : hello world PlantUML Block-3 @startuml (*) –> “Initialization” if “Some Test” then –>[true] “Some Activity” –> “Another activity” -right-> () else ->[false] “Something else” –>[Ending process] () endif ... Read More
-
Mermaid 예시
1. Pie chart pie title Pets adopted by volunteers "Dogs" : 386 "Cats" : 85 "Rats" : 35 2. sequence diagram @startmermaid sequenceDiagram Alice -» Bob: Hello Bob, how are you? Bob–»John: How about you John? Bob–x Alice: I am good thanks! Bob-x John: I am good thanks! Note right of John: Bob thinks a longlong time, so longthat ... Read More