Spring Security 로그인하여 세션에 정보를 저장하고, 유저 권한에 따른 URI 접근까지 Spring Security를 이용하면 간편하게 구현 할 수있다.. 라고 배웠지만, 공부하기가 너무 어렵다. 이런저런 예제를 따라해보기도 했고, Spring Boot와 Spring의 시큐리티 설정이 얼마나 다른지도 몰라 예제를 찾아보는 것도 힘들었다. 2일간 삽질하여 얼추 원하는 방향으로 구현 할 수 있었다. (막상 완성된 예제를 보니 아주 어렵지는 않았지만 삽질의 주된 원인은 어떤 곳이 문제인지 알 수가 없었기 때문이었다.) 시큐리티는 개발하면서 지속적으로 공부를 해봐야 정교하게 구현 할 수 있을 것 같다. 현재까지 구현한 시큐리티는 아래와 같다. WebSecurityConfigureAdapter WebS..
타임리프 Thymeleaf 이전에 게시판 프로젝트를 하면서 JSP를 주로 써왔지만, 요즘엔 JSP보다는 다른 템플릿 엔진들을 더 많이 쓴다는 말에 그중에 하나인 타임리프를 사용해보기로 했다. 사실 구현상에서 JSP에 불편함을 느낀 것은 아니었지만, 타임리프를 적용해보니 만족도가 꽤 높았다. 일단 HTML 사이에 JSP문법들이 생기는지 않아 HTML 태그가 더럽혀 지지 않고 훨씬 깔끔했다. 초기에 적응하는 시간만 지난다면 가독성도 높아졌다. 먼저 디자인 없이 기능상의 뷰를 구현해보고, 이후에 CSS를 적용할 때 이점은 다시 한번 느낄 수 있을 것 같다. //타임리프를 이용하여서 구현한 for문 - 별도의 태그선언 없이도 기존 태그 안에 속성처럼 작성이 가능하다. 삭제 AJAX 구현을 위한 fetch API..
프로그래머스 알고리즘 - 단어변환 ☞ 단어변환 문제 링크 문제의 핵심은 각 word를 노드로 두고, 변환 가능한 word간에는 간선(edge)로 연결해둔 다음에 그래프 탐색을 진행하면 어렵지 않은 문제 였습니다.☞ 그래프(Graph) DFS 탐색 구현하기 문제풀이 코드의 전체적인 틀은 그래프 탐색을 응용합니다. class Graph { private Word[] words; . . . } 입력값의 문자를 이용한 만든 클래스 Word를 그래프 탐색의 노드(Node)로 치환합니다. class Word { private String name; private List changeable; //인접 노드(Word)들을 저장하는 리스트 private boolean visited; . . . } 주어진 word와 기..
순열(permutation) 순열이란 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수를 말합니다.예를들어, 집합의 원소가 {A, B, C} 일때, 3개의 원소를 모두 사용하여 순서를 고려해 나열하는 경우의 수는 A B C, A C B, B A C, B C A, C B A, C A B로 총 6가지 경우가 나오게 됩니다. 순열 알고리즘 순열의 모든 경우를 빼먹지 않고 고려하기 위해서는 아래와 같은 로직으로 찾아갑니다. 0번째 인덱스 원소를, 0번째 부터 n-1번째까지 위치를 바꿉니다. ( A B C를 기준으로 이 과정을 진행하면 A B C, B A C, C B A 가 됩니다.)1번 과정을 진행해서 나온 경우들을, 1번째 인덱스 원소를, 1번째 부터 n-1번째까지 위치를 바꿉니다.이러한 과..
프린터큐 ☞ 문제링크 Document를 클래스로 선언해야겠다는 생각만 했다면, 나머지는 큐의 기능을 문제 그대로 구현만 하면 되는 문제 였습니다. 문제 풀이 전략 (java) Document(문서) 클래스를 선언한다. class Document { } Document는 필드값으로 sequence(순서)와 importance(중요도)를 갖는다. class Document { private int sequence; private int importance; } 입력값을 기준으로 Document 인스턴스들이 담겨있는 큐를 정의한다. public static int solution(int N, int M, int[] importance) { Queue documentQueue = new LinkedList();..
개요 사용자가 기존 데이터를 수정하게 되었을 때, 기존 데이터를 수정된 데이터로 바꾸는 과정이 필요합니다. 이런 경우, 원본 Domain(혹은 DTO)에게 수정된 내용을 주입하기 위해서 Setter를 이용하는 방법이 진행됩니다. 다만, 필드가 많은 경우 무의미하게 Setter가 많아지게 되고 코드가 길어지게 되는 문제가 생깁니다. 이런 경우 Setter대신 BeanUtils.copyProperties() 메소드를 이용하면 단 한줄로 과정이 처리가 됩니다. Setter로 설정하는경우 public Book modifyBook(Book book) { Book bookById = bookRepository.findBookById(book.getId()); //기존 데이터 bookById.setName(book...
객체지향의 4대 특성? 캡슐화, 상속, 추상화, 다형성이 객체 지향의 4대 특성이라는 것은 개발자라면 한번 쯤은 들어본 내용 입니다. 4대 특성에 대한 내용은 다른 포스팅에 정리 해두었습니다.☞ 객체의 캡슐화(Encapsulation), 접근제어자☞ 객체의 추상화 (Abstraction)☞ 객체의 다형성(Polymorphism) 하지만 개인적으로 각각의 내용을 공부 하고 나서도 꼭 찝찝한 부분이 있었습니다. '이게 객체지향의 특성인데.. 뭐 어떻다는 거지?' 뭔가 와닿지 않고 별개의 개념을 말로써만 이어 붙였다는 기분이 들었습니다. 그리고 4대 특성에 대해 쉽게 이해할 수 없을지를 고민해 봤고 그 결과 한가지 키워드를 붙이면 아주 자연스럽다는 것을 알게 되었습니다. 바로 '~ 할 수 있다' 라는 키워드 ..
@OnDelete(action = OnDeleteAction.CASCADE) 설정 엔티티를 삭제할 때, FK로 연관 되어져 있는 엔티티가 있다면 삭제 시에 Constrain 에러가 발생한다. 해당 되는 엔티티를 직접 삭제 하는 방법도 생각해봤지만, (Result - Question - BookContent - Book) 이런식으로 연쇄적으로 연관 되어 있는 엔티티를 모두 삭제하는 것은 비효율적이라고 생각되어서 DB 테이블 상의 CASCADE 옵션을 고려 해봤다. 그러던 중, 테이블을 직접 설정하지 않고 JPA로만 설정 하는 방법을 찾으보니 역시 가능했다!! @OnDelete 설정으로 마치 DB 테이블상의 옵션처럼 FK로 연관되어져 있는 열을 삭제할때 같이 삭제되도록 설정이 가능했다. @ManyToOne(..