클린코드.. 이거만큼 학습하긴 어려운건 없을거 같다. 쉬우면서 어렵고 알거 같으면서도 막상하려고 하면 쉽지 않는 뭐 그런느낌이다.내가 생각할때, 고도화보다 더 중요하다고 생각한다. 왜냐하면 코드를 깨끗이 작성하게 되면 추후 확장성도 증가 할 수 있기 때문이다.코드가 과도하게 비대해지면 결국엔 나중에 수정하려고 하면 어떤걸 수정을 해야 하는지 잘 모르는 경우도 많다고 생각한다.그렇다고 해서 이게 습관화가 되어 있지 않기 때문에 나중에 해야지 하면 결국엔 또 안하게 될거 같다.클린코드 책을 보면 다음과 같은 제안을 하였다. 1. 생성자를 중복 정의할 때는 정적 팩토리 메서드를 사용한다.2. 함수는 작게 만들어라!3. 함수는 한 가지만 해라!4.함수 인수 - 플래그 인수는 추하다.5.반복하지 마라! a.k.a..
외부에서 SQL문법을 넣어 공격하는 기법으로개발자가 예상치 못한 결과를 야기시킬 수 있다.예를들어, 로그인을 시도해야 하는경우 id에 admin을 입력하고 password는 모르는 상황에서로그인이 되게 하려면 --를 붙이면 Sql공격이 가능해진다.보통 SQL문을 작성할때 select * from table where user_id = 'admin'인데 여기다가--은 SQL에서 주석을 뜻하기 때문에 뒤 문장들은 모두 주석처리가 되어진다.그렇게 되면 아이디만 입력해도 로그인이 가능해진다.여기에는 -- 말고도 'or 1=1' 이런 쿼리를 넣거나 다양한 방법으로 공격이 가능하다.그렇다면 이것을 막는 방법은 무엇이 있을까?1. SQL에 해당하는 모든 특수 문자를 막는 방법2.preparestatement로 전달 ..
어제 대략적인 도커학습을 마치고오늘은 Dockerfile에 대해 학습을 하려고한다.내가 잘못알고 있던 부분이 인텔리제이에서 Dockerfile을 run하게 되면 실행이 된다고 생각했다.하지만 아니었다. 이 행위는 단순히 이미지를 만드는 행위이기 때문에 실제로는 실행이 안된다고 했다.그러면 의문이 있다. 도커파일로 도커파일을 어떻게 만들 수 있을까? 나는 단순히 실행 버튼을 눌러서 해결했었는데이거는 아닌가?아닌거 같다.이미지 빌드 방법은 다음과 같다고 한다.표준적인 도커파일 빌드 명령어는 다음과 같습니다:docker build -f Dockerfile -t {도커이름} .여기서:-f Dockerfile: 빌드에 사용할 Dockerfile 지정 (기본값이라 생략 가능)-t my-app: 이미지에 이름 태그 ..
설계에 대한 학습은 어느정도 되있는 상태인데..개발에 대한 마지막이라고 할수 있는 CI/CD에 대한 지식이 너무 전무하다는 생각이 들었다.이 글은 도커에 대한 전반적인 내용은 다루지 않을 예정이다.내가 이해하고 학습한 내용을 작성할예정이다.이렇게 하는이유는 이론적으로 학습한다고 해서 이걸 기억하기에는 쉽지 않을거고도커에 대한 모든 내용을 내가 사용하지 않을 가능성도 높다.그렇기 때문에 도커가 왜 필요하고 어떻게 사용하는등 언제든지 사용할 수 있는 범위해서 공부할 예정이다.그래야 퍼즐처럼 끼워맞추기가 가능할거구 확장을 한다면 조금더 편할거라 생각한다.그러면 내가 왜 CI/CD를 학습하면서 왜 도커를 먼저 학습을 할려고 하는지 이해를 해야한다.그래야 도커와 CI/CD의 연관성을 생각하면서 공부할 수 있기 때..
서론드디어 2차 프로젝트가 끝이 났다. 이번에도 테스트를 진행하지 못했다. 무엇이 문제였을까?도커도 하지못했고 문서화도 하지 못했다. 원래 다른 공부도 병행하면서 해야 되는데 시간이 없었다.이게 그것중 하나다.이번에 공부할건 JVM이고 최대한 인터넷으로 찾지않고 진행할예정이다.그리고 살을 붙여나가는 형태가 좋지 않을까 싶다.JVM이란 과연 무엇일까? Java Virtural Macine으로 자바 가상 환경에서 동작하는 것을 말한다.결국 자바내에서 동작하는 가상 머신인것을 알 수 있다.그러면 이게 왜 존재하는지 부터 생각을 해야 할거 같다.흔히들 JVM환경의 언어를 사용하는 이유가 플랫폼에 구애받지않는다는 걸로 알고 있다. 결국 JAVA내에는 또 다른 환경이 존재하는 느낌이다. 그럼 생각을 해야 할것이JV..
후... 프로젝트 막바지에 들어섰다.문서작업(스웨거)이 안되었기때문에 이를 추가를 해야한다.그래서implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.4.0' 요걸 추가했다. 이제 스웨거3.0을 써야 하니까 저렇게 사용했다. 그리고 실행을 시키면 되곘지 하고 실행을 시켰다.아니 왜 안되냐고...ㅜㅜㅜ알고보니@RestControllerAdvice랑 충돌이 나는것이 그 이유였다.왜냐하면 얘를 주석처리하고 실행했더니. 이번에는 너무 잘되었다.그런데 여기서 문제가 발생했다.이러면 헨들러가 동작을 안하니 에러도 커스텀한 결과가 나오지 않는다는것이 가장 큰 이유였다.이상하다. 분명 이거 이렇게 썼던거 같은데..방법이 없는걸까? 알고보니 버전이..
지금 현재 프로젝트는 MSA로 되어 있기 때문에 모놀로식 프로젝트때 사용했던 스프링 시큐리티 방식을 사용하지 못한다.만약에 사용을 하려면 스프링 시큐리티를 각 도메인마다 사용을 해야하는데 그렇게 되면 예상치 못한 이슈가 발생할지도 모르기때문에 도메인마다 시큐리티 사용하는것을 하지 않았다.그러다 보니 권한 체킹하는것이 쉽지가 않았다. 모노로식에서는 어노테이션 하나만 넣으면 되는것이사용하지 못하기 때문이었다.그렇다면 이것을 어떻게 해결하면 좋을까?해결할 수 있는 방안은 총 4가지로 필터, 인터셉터, AOP, 각 각 서비스마다 사용하는 방법이었다.그중 내가 선택한것은 AOP방식이었다. 일단 필터가 동작하는 부분은 서블릿 필터이전에 동작을 한다. 그렇다는건 컨트롤러가 들어오기전에 그것을 체킹해야된다는 뜻인데사실..
인덱스 - btree 왼쪽 작은거 오른쪽 큰거삽입,삭제 → 수정위치찾아서 추가삭제 → 정렬언제 리벨런싱되는지..Mysql은 기본적으로MySQL(InnoDB)은 기본적으로 B+Tree 인덱스를 사용하며,삽입·수정·삭제 시 트리 구조의 균형과 정렬 상태를 유지합니다.삽입 시노드에 여유 공간이 있으면 정렬된 상태로 추가되지만,노드가 가득 찬 경우 split(분할)이 발생하고 재 정렬이 이루어질 수 있습니다.삭제 시 키가 사라지면 노드 간 병합(merge)이나 키 차용(borrow)과정이 발생해, 구조적 재 정렬과 균형 유지가 수행 됩니다언제?노드가 가득 찼을 때 새로운 데이터를 삽입하면 오버플로우(Overflow)가 발생.트리의 높이를 최소로 유지하기 위해 노드를 두 개로 나눔.과정:중간 키를 선택해 상위 노..
동시성이라는건 무엇일까?여러 쓰레드가 동시에 접근해서 발생하는 문제라고 한다.이렇게까지는 알고는 있는데 내가 하고 있는 테스트가 과연 동시성이 맞는걸까?간단한 코드를 작성하였다.@Testpublic void testConcurrency() throws InterruptedException { UUID stockId = UUID.randomUUID(); Stock stock = new Stock(stockId, 1000); StockRepository mockStockRepository = Mockito.mock(StockRepository.class); Mockito.when(mockStockRepository.findByIdAndDeleteByIsNull(stockId)).then..
레이어드 아키텍처로 개발하고 있었는데 문득 궁금증이 생겼다. 과연 이게 맞는것일까?나같은 경우는 Page객체를 도메인객체에 두고 사용을 하고 있었고,Pageable객체를 프리젠테이션 계층에서 두고 넘겨주고 있었다. 왜냐하면 마땅히 방안이 생각나는게 아니었기 때문에 나는 그냥 사용하기로 했다. 오늘 팀원분들과 코드 리뷰하면서 이렇게 개발하면 될거 같아 소개 하려고 한다.일단 원래 방식의 문제가 Pagable이라던지 Page가 외부에서 가져온 라이브러리라 인프라스트럭처에서 사용하는것이 맞는걸로 알고 있다.근데 몇몇의 라이브러리는 편의성을 위해 프리젠테이션 혹은 어플리케이션측에 사용하는걸로 알고 있다.대표적인 예시가 ResponseEntity인데 얘도 어찌보면 외부에서 가져온것이기때문에 인프라에 있어야 하지만..
1차때는 모노로식으로 개발을 해서 설계가 없이 들어갔었는데 이번에는 MSA을 하기로 했다.전 직장에서도 MSA로 개발했지만 개인적으로 이게 맞는 방법인지에 대해서 의구심이 계속 들었다.그러다 레이어 4계층이라는 걸 알게 되었다.근데 이게 생각보다 쉽지 않았다. 처음부터 잘될리가 없지만, 프리젠테이션이며, 어플리케이션이며 하나같이 이해가 안가는거 투성이었다.이게 DDD라는 건가? 도메인 주도라는게 도대체 뭘까?개인적으로 요런것들이 프로젝트 전반에 걸쳐서 가장 중요한 작업이라고 생각이 들었다.그래서 튜터님에게 계속 질문을 했던걸로 기억한다. 아래는 튜터님이 주신 그림이다.중요한 점은 고수준을 얼마나 보호할 수 있는가를 생각해봐야 한다고 하셨다.그럼 여기서의 고수준은 어떤걸까? 바로 도메인이다. 그림으로 보면..
레코드는 자바14부터 등장하였다.레코드의 장점은 불변함을 가진다는 것이다.그러니까 데이터가 변경이 되지 않는 다는 뜻이 된다.사용법은 간단하다.요런식으로 ()안에 클래스에 데이터를 넣어주면 된다.이렇게 되면 new CreateClientRequest(name...); 이랑 똑같이 동작을 하게 된다.어떻게 보면 저것만 사용하니까 생성자를 추가적으로 사용해야 하는 클래스보다 깔끔하다는 느낌이 든다.그렇다면 생성자를 또 만들고 싶다면 어떻게 해야 할까?이것도 클래스와 똑같이 생성자를 만들면 된다.하지만 주의해야 할점이 있다.애초에 위 데이터들은 불변값이다. 따라서 this.name = name이런식으로 데이터를 바꾸는것은 불가능하다.어떻게 해결할 수 있을까?this()로 데이터를 입력을 받아줘야 한다. thi..