본문 바로가기

Spring14

JWT + Spring Security 를 이용한 로그인 고찰 - 1 https://spring.io/guides/topicals/spring-security-architecture Spring Security Architecture this topical is designed to be read and comprehended in under an hour, it provides broad coverage of a topic that is possibly nuanced or requires deeper understanding than you would get from a getting started guide spring.io 위 공식사이트와 블로그의 글들을 참고하여 코드를 재작성해보고 커스터마이징하여 어떤 원리로 돌아가는지 구체적으로 분석해본 글입니다. 목표는 전체적인.. 2022. 2. 26.
[Kafka & Zookeeper 일지] Subscriber 에서 생기는 하나의 테이블에 같은 객체 쓰기(write)에 대한 동시 접근 제어 만약 FOO라는 객체에 속성이 A부터 D까지 4가지가 있다. 빨간 박스인 A가 primaryKey 이다. 먼저 카프카 클러스터에는 2개의 브로커가 떠있고 Subscriber가 2개의 토픽을 구독하고 있는 상황이다. topic1 에서 읽은 메세지인 Foo의 pk 인 A와 topic2 에서 읽은 메세지인 Foo의 pk인 A 가 다르다면 문제 되지 않는다. 하지만 pk가 같은 객체에 똑같이 쓰기를 한다면 다음과 같이 생각할 것이다. 1. topic1에서 읽어 드린 메세지에서 똑같은 pk를 가진 객체가 DB에 있는지 검사후 없다면 DB에 생성한다. 1-1. 똑같은 pk를 가진 객체가 DB에 있다면 B,C 속성을 업데이트한다. 2. topic2에서 읽어 드린 메세지에서 똑같은 pk를 가진 객체가 DB에 있는지 검.. 2021. 3. 16.
[일지] 의존관계 주입의 필요성 # 객체 지향 설계에서 의존관계 class Car{ // Engine 은 인터페이스 & SuperEngine 은 Engine의 구현체 private final Engine engine = new SuperEngine(); ... } 위와 같은 코드가 있다고 가정해보자. 자동차는 반드시 엔진이 필요하다. 그래서 처음 설계할 때, 자동차는 엔진이라는 인터페이스에 의존하도록 설계하였다. 인터페이스에 의존하는 것처럼 보이지만 실제는 그렇지 않다. 아래 그림처럼 되기를 원하지만 실제는 아래와 같다. 만약 울트라 엔진으로 고친다면 아래처럼 Car의 코드를 수정해야한다. class Car{ // Engine 은 인터페이스 & UltraEngine 은 Engine의 구현체 private final Engine engi.. 2020. 10. 11.
[일지] List 를 pageable 과 PageImpl 로 구현하기 ( List to pageImpl ) 1. queryDSL의 fetchResults 로 한번에 가져오기. (가장 이상적) Controller 부터 받은 pageable 로 offset 과 pageSize를 알 수 있다. 아래는 유저이름과 city이름을 최초 검색했을때 나오는 쿼리다. 영속성 컨텍스트는 비어있다. 위에서 알수 있는 것처럼 fetchResults를 하면 전체 total을 알기 위한 쿼리 1번과 content를 위한 쿼리 1번 총2 번을 날린다. 하지만 컬렉션을 가져오기 위해서는 위처럼 하기가 힘들다. 결국 서버 딴에서 데이터를 가져오고 알아서 데이터를 걸러야한다. 2. 데이터를 가져온뒤 List 를 PageImpl 로 변환하기 검색 조건이 여러개 붙다 보면 서버 딴에서 데이터를 가공해야 할 때가 있다. 만약 가공한 데이터 리스트.. 2020. 9. 17.
[일지] mustache 에서 javascript 정적 리소스를 불러올 때 GET http://localhost:XXX net::ERR_ABORTED 404 1. security 권한 설정으로 정적 리소스 파일에 권한을 확인한다. 2. 1번과 아무 관련이 없다면 build.gradle에 의존성으로 mustache 가 추가 되어있는지 확인한다. mustache 플러그인이 설치 되어 있어야 함! 단, 타임리프 같은 다른 서버템플릿 엔진이 컴파일 된다면 정적 리소스를 불러올 때 오류가 날 수 있다. 3. 프로젝트 클린을 시도해본다. 4. 정적 리소스 경로가 올바르게 되어있는지 확인한다. 만약 아무런 변경도 하지 않았다면 /resources/static/ 에서 정적 리소스들을 찾을 것이다. 5. 파일을 불러 오는 path가 정확한지 확인한다. 예를 들어 아래와 같은 스크립트의 경로가 있다면 실제 경로는 /resources/static/js/app/user.js 다... 2020. 9. 15.
[일지] 쿼리가 너무 많이 전송되는데 줄일 수 없을까? 전체 도메인 설계 부분 중에 Store와 관련있는 부분만 따로 캡쳐하였다. 전체 도메인 그림은 필자의 깃허브 레포지토리로 가면 된다. https://github.com/hangeulisbest/market hangeulisbest/market API 개발 . Contribute to hangeulisbest/market development by creating an account on GitHub. github.com 모든 가게들의 정보를 요청하면 RESPONSE의 JSON FORMAT은 아래와 같다. count : 모든 가게들의 개수. data : 가게들의 리스트. data/ id : 가게의 pk data/name : 가게의 이름 data/city: 가게의 도시 주소 data/street: 가게의 거.. 2020. 9. 7.
[일지] Category는 삭제할 수 없다고?? 먼저 도메인 모델을 보자. Category 에서는 CategoryStore를 일대다로 참조하고 있으며, Store 에서는 CategoryStore를 일대다로 참조하고 있다. 또한 Store 에서는 categoryStoreList를 cascade = CascadeType.ALL 옵션을 주었다. 왜?? 만약 가게 사라진다면 가게와 연결해 있던 카테고리들을 모두 삭제해야하기 때문이다. 예시 데이터를 먼저 넣어보자. 여기서 "연우김밥"가게를 삭제해보자. 그러면 어떻게 될까?? 원하는 대로 잘 된다! 다시 원상 복귀하자. 그렇다면 여기서 김밥이라는 카테고리를 삭제하면 김밥을 참조하고있는 categoryStore도 삭제해야 될 것이다. 그래서 카테고리에 아래처럼 해주고 "김밥"을 삭제하면 category_store.. 2020. 9. 2.
[일지] Static 메서드로 생성하는 객체가 자동으로 save?? 요구 사항을 아래 처럼 정리 하였다. 가게는 카테고리 여러개를 가지고 있을 수 있다. 카테고리는 여러개의 가게를 가질 수 있다. 카테고리는 0개이상의 여러개의 자식을 가질수 있고 하나의 부모 혹은 부모를 가지지 않을 수 있다. 이를 그림으로 나타내면 이렇게 일대다 와 다대일로 풀어서 나타낼 수 있다. 개발 공부를 하던중 재밌는 사실을 하나 발견했는데 과정을 이야기 하겠다. Store와 Category를 연결하려는 작업을 하는데 자식 하나만 연결하면 자동으로 부모의 카테고리 까지 모두 포함시키는 함수를 작성하고자 했다. 위 처럼 카테고리와 가게를 넘기면 카테고리와 가게를 연결하는 categoryStore를 생성하는데 만약 category의 부모가 있다면 재귀로 호출하는 것이다. 만약 부모까지 적용해버리는 .. 2020. 9. 1.
[일지] TestRestTemplate 로 테스트 하면서 궁금했던 점(feat :NoSuchBeanDefinitionException) 테스트는 Junit5 에서 진행했고 @RunWith는 Junit5부터는 안써도 된다. 처음 궁금했던 건 아래의 테스트 코드는 오류가 난다는 것이다. 이 오류는 스택오버플로우 질문에서 해결했다. https://stackoverflow.com/questions/39213531/spring-boot-test-unable-to-inject-testresttemplate-and-mockmvc spring boot test unable to inject TestRestTemplate and MockMvc I am using spring boot 1.4.0.RELEASE. I am writing tests for my controller class. I get the following exception. org.sp.. 2020. 9. 1.