본문 바로가기

분류 전체보기247

쿼리 작성 및 최적화 요새 스프링 프로젝트, DB, 자소서 수정, 토비 스프링, 코테 준비 등등을 하고 있다. 하루가 너무 짧기도 하고 잠을 적게 자도 괜찮은 체질이 되고 싶은 요즘이다. DB공부는 Real Mysql을 읽고 있다. 읽기 너무 어려운 책인데.. DB 질문도 신입 개발자 면접에서 디테일한 질문까지 필수라고 하기 때문에 열심히 정리하면서 읽고 있다. 쿼리 작성 및 최적화 부분을 공부중인데 이 부분에서 헷갈리는 개념을 정리해볼 생각이다. Join 기법 Nested Loop Join 중첩된 반복문과 유사한 방식으로 조인을 수행 반복문 외부의 테이블을 선행 테이블 & 외부 테이블이라 칭함 반복문 내부의 테이블은 후행 테이블 & 내부 테이블이라고 칭한다. 조건을 만족하는 선행 테이블 행을 추출 후 후행 테이블을 읽으며 .. 2022. 5. 17.
2022.05.17 「Lv.2 프린터」 문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 .. 2022. 5. 17.
2022.05.17 「@Transactional 옵션 및 성능」 스프링 부트 프로젝트를 하던 도중 Service 클래스에서 @Transactional 사용에 옵션을 설정할 수 있다는 것을 처음 알았다. 옵션을 한번 추가해보라는 피드백을 받고 한번 이 에너테이션에 대해 알아보기로 했다. 프로그램 성능에 직접적인 영향을 끼칠 수도 있는 중요한 옵션이기 때문에 한번 정리를 해보겠다. 트랜잭션(Transaction)의 정의 데이터 베이스의 상태를 변경할 때, 한번에 수행되어야 하는 연산 트랜잭션 ACID 성질 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나 해야한다. 일관성(Consistency) : 트랜잭션은 일관성 있는 DB 상태를 유지해야한다. 작업 처리의 결과가 항상 일관되어야 함. 독립성(Isolation) : 동시에 실행되는.. 2022. 5. 17.
2022.05.16 「리팩토링」 프로젝트를 진행 중이다. 제대로 신경 써서 하다 보니 너무 오래 걸리는 것 같다. 또 제대로 짰다고 생각한 코드도 리팩터링 할 영역 투성이다. 이러면서 실력이 느는 거겠지..? 진짜 제대로 된 프로젝트 한번 만들어보자 리팩토링 목록 불변 객체 이슈 => setter를 허용한 객체 문제 : 불변성을 띄질 못한다. 해결 : loginDTO 객체는 값을 전달하는게 목적이므로 확실하게 불변성을 지녀야 한다. 따라서 불변객체로 다시 만들자 public class UserLoginDTO { private final String userId; private final String userPw; public UserLoginDTO(String userId, String userPw) { this.userId = use.. 2022. 5. 16.
2022.05.16 「Lv.2 카펫」 오늘은 프로그래머스에서 완전 탐색 문제 중 레벨 2의 카펫 문제를 풀며 정리를 해보겠다. 항상 느끼는 거지만 자료구조에 대해 정리 좀 해야겠다. 풀 순 있는 문제라도 자료구조에 대한 개념을 이용해 푸는 것과 내 방식대로 푸는 것은 나중에 큰 차이가 있을 것이 분명하므로 오늘이나 이번 주 안에 무조건 정리하는 것으로 하자! 문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 .. 2022. 5. 16.
2022.05.14 「JWT 인증」 인증을 구현하기 위해 기존에 사용하던 Session 로그인이 아닌 JWT를 이용하여 인증을 구현했다. 토큰을 처음 사용했다 보니 알아가는데 너무 오래 걸렸다. 무엇보다 나는 스프링 시큐리티를 사용하지 않고 서블릿 필터나 스프링 인터셉터를 이용해 토큰 유효성 검사를 하려고 했어서 더 쉽지 않았던 것 같다. 이번 프로젝트 인증에서 Session을 사용하지 않은 이유는 서버의 규모가 확장될 때의 인증 문제이기 때문인데 JWT를 이용한 인증도 여러 가지가 있기 때문에 나의 프로젝트에 맞는 단계가 어디인지에 상당히 헷갈렸던 한 주였다. 인증 작업을 하며 문제가 생겼던 부분이나 구현한 부분에 대해 정리를 해보겠다. Rest API를 설계할 때 인증은 session 기반이 아닌 토큰 기반으로 하는 것이 더 restf.. 2022. 5. 14.
2022.05.13 「Session과 Token(Jwt) & 인증과 인가」 현재 진행 중인 프로젝트에서 로그인을 진행 중인데 기존에 로그인은 세션으로만 진행했었다. 로그인을 구현하는 방식은 여러 가지라고 배웠는데 그중 세션만 이용해봤기 때문에 토큰을 이용한 인증 경험도 필요하다고 생각을 했다. 그중 내 서비스에 대해 또 서비스 확장성에 대해 확실히 맞는 인증 방식을 결정해야겠다고 생각을 했고, 세션과 토큰의 사용처와 개념에 대해 정리를 해보려고 한다. 인증과 인가 인증(Authentication) 서비스의 사용자가 맞는지 확인하는 과정 대게 로그인하는 과정 인가(Authorization) 인증이 완료된 사용자에게 리소스 접근 가능하도록 사용 권한을 부여하는 작업 액세스가 허용된 데이터 및 해당 데이터로 할 수 있는 모든 작업을 지정함 HTTP의 특성 http는 stateless.. 2022. 5. 13.
2022.05.12 「LV2 소수 찾기」 여느 날처럼 코테 문제를 계속 풀고 있다. 자료구조도 날 잡아서 한번 정리해야 되는데 시간이 좀 나질 않는다. 시간 배분 좀 잘해보자. 어제오늘 푼 것이 소수 찾기라는 완전 탐색 문제인데, 이건 소수라는 것이 결국 1과 자신만을 약수로 가지는 수를 말한다. 어떤 블로그에서 봤는데 결국 문제를 간소화하는 게 관건이라는데 그것을 보는 안목을 좀 길러야겠다. 소수 찾기 소수 : 1과 자기 자신만을 약수로 가지는 수 String 숫자 값을 받아 소수를 조합하는 개수를 구하는 문제이다. import java.util.HashSet; import java.util.Iterator; class Solution { HashSet numberSet = new HashSet(); /** * 소수 확인 메서드 * @para.. 2022. 5. 12.
2022.05.12 「ResponseEntity body & BuilderPattern & Join」 Restful 한 api를 설계하는 것은 참 까다로운 것 같다. 학원에서 완전 기초적인 내용만 배운 것도 있었고 그 부분만 머릿속에 깊이 저장되어 있었기 때문에 제대로 된 rest 방식은 다른 것임을 이해하는데 시간이 너무 오래 걸렸다. 회원 가입, 로그인만 하더라도 어떻게 보면 누군가에겐 별게 아닐테지만 어떤 식으로 생각을 하며 설계를 하느냐에 따라 시간이 오래 걸리는 것 같다. 어제 한 비밀번호 암호화도 마찬가지다. 특히 restful한 방식으로 설계를 하는 것은 처음 해보기 때문에 더 낯설고 이해가 잘 안 되었다. 보통 Return Type인 ResponseEntity를 사용해 응답 관련 정보를 돌려주는데 헤더와 바디에 적절한 데이터를 넣어주는 걸 고르는 게 쉽지 않았다. 오늘도 아침부터 지금 오후.. 2022. 5. 12.
2022.05.11 「SHA-256 + Salt & 인증」 인증 관련해서 사실 스프링 시큐리티를 사용해도 괜찮지만 순차적으로 가기 위해서 순수하게 SHA-256 암호화 알고리즘을 이용해 비밀번호 암호화와 로그인을 원시적으로 구현한 하루다.. 거진 12시간을 삽질한 것 같다. 암호화 알고리즘 이용과, Mybatis 매핑 문제도 있고, ModelMapper를 사용해 DTO VO 매핑이 계속 안되어서 하루 종일 멘털이 나갔었다. 다른 공부도 할게 너무 많은데 프로젝트만 비중이 많았던 하루라 너무 아쉽다. 하지만 삽질한 만큼 내 것이 되었으면 좋겠다. 오늘은 하루종일 삽질한 내용을 기반으로 한번 정리를 해보려고 한다. 여담으로 다이어트중인데 요새 상주하는 공부 환경에서 오트밀 미니 바이트를 제공해주는데 이거 진짜 너무 맛있다.. 예전엔 진짜 단 거 잘 참았는데 늙었나 .. 2022. 5. 11.
2022.05.10 「Rest Ful Api & DTO,VO mapping & Mysql Index & 상수화」 프로젝트를 진행 중에 수정사항이 너무도 많다는 것을 알게 되었다. 예전에 학원에서 프로젝트를 할 때는 어떻게 만들든 기한이 정해져 있었기 때문에 완성도가 우선이었고, 유지보수에 대한 프로그래밍에 신경을 쓰지 않았었다. 하지만 실제로 제대로 된 프로그래밍을 하다 보니 예전 버릇이 나오게 되었고, 이번 리뷰를 받은 김에 리팩터링을 빠르게 하며 정리를 해볼 생각이다. RestFul Api 의 return 값 1. 되도록 체이닝 하는 방식을 사용 2. response에 해당되는 헤더 메시지(상태 코드, 메시지 등등), 바디 값을 다 넣도록 노력하자 DTO, VO 간의 매핑 현재 Mybatis를 사용중이므로 테이블 자체의 Entity는 VO service mapper 계층 이동 시 VO를 이용해야 함 .. 2022. 5. 10.
2022.05.09 「해시 Lv.2」 요새 매일매일 코테를 준비하며 프로그래머스 문제를 풀고 있다. 처음엔 완전히 막혔지만 그래도 이젠 어느 정도 풀이가 떠오르긴 한다. 한 가지 아쉬운 점은 생각보다 클래스마다 다양한 메서드를 가지고 있고 이를 잘 알고 활용해야 한다는 점이다. 제일 많이 나오는 유형인 해시 문제를 마주하고 문제를 풀기 위해 활용할 메서드를 검색해서 이를 활용하여 문제를 풀었지만 한번 정리해볼 만한 가치가 있다고 생각이 들어서 이렇게 정리하게 되었다. 문제 설명 위장이라는 문제인데, 옷의 종류와 옷의 이름으로 이루어진 2차원 배열을 가지고 그 경우의 수를 구하는 문제이다. 매일 옷을 다르게 입어야 하고, 하루에 옷 1개는 무조건 입는 조건이다. 해시를 이용해 풀란다. 풀이 public int solution(String[][.. 2022. 5. 9.
2022.05.08 「RestFul한 api? & ResponseEntity의 사용」 어김 없이 스프링 프로젝트를 진행중이다. 일주일 전 View를 없애고 좀 더 Back에 집중된 api를 설계하는 것으로 초점을 맞췄다. handler 메서드의 반환 값을 단순히 json 형식으로 보여주면 되는 거 아니냐? 라고 생각을 했지만 검색을 여러번 해보니 정말 확실하게 알기 전까지는 함부로 생각하지 말자라는 결론을 내렸다.. 어렴풋이 배웠던 rest api가 떠올랐고 제대로 공부를 하고 이용을 해서 restful한 api를 만들어야겠다는 생각에 개념정리를 결심하게 되었다. 또 반환 타입으로 ResponseEntity의 사용이 많은데 이 타입을 왜 사용하는지도 한번 알아봐야겠다. Rest가 정확히 뭘까?? Representational State Transfer -> 자원을 이름으로 구분하여 해당 .. 2022. 5. 8.
2022.05.06 「Git Flow 이슈」 스프링 프로젝트를 진행중이다. 단순히 Master 브랜치만 이용하는 것이 아닌 코드 리뷰를 받기 위해 Pull Request를 올려야하기 때문에 여러 개의 브랜치를 나누어 작업하는 도중 문제가 발생했다. pr을 올리기 위한 브랜치간의 분업이 적절히 이루어져야 하는데 혼자 하다 보니 이것 저것을 건들어서 다양하게 건든 것이다. 그래서 알맞은 해결방안을 모색해보고자 한다. 인텔리제이 Branch 체크아웃 하는 방법 혹여나 잘못 git push를 했다면 2022. 5. 6.
Flyway & DB Migration 을 적용시켜 보자 스프링 프로젝트를 진행하면서 나는 DB 테이블을 한 번에 다 생성하고 시작하는 것이 아닌 필요한 것을 만들어가면서 진행하고 있었다. 그러고 Front를 만들지 않기 때문에 DB data를 직접 mysql을 열어 넣어주고 수정하는 작업을 반복하게 되었다. 참 비효율적이라 생각했다. 그러던 도중 Flyway라는 Tool을 알게 되었다. 새로운 기술을 마주하면 항상 낯선 기분이지만 DDL을 자바에서 직접 관리를 하게 해주는 툴이라는 것을 알게 되었고, 나처럼 스키마의 잦은 변경이 일어날 경우에 사용해보면 좋겠다는 생각이 들었다. 그래서 한번 정리해보고 사용해 볼 생각이다. 혹시나 해서 Schema 가 뭐야? 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것! 1. 개념 스키마 - 전체적인 뷰 2.. 2022. 5. 3.
반응형