JPA 그래프 탐색 JPA를 사용하기 위해서 만든 도메인 객체 A,B가 있다고 가정해보자. A객체가 B객체에 대한 방향을 갖는다고 할 때, A객체는 B객체의 그래프 탐색이 가능하다. (쉽게 말하면 A.getB를 이용해서 B정보를 가져 올 수 있다는 점이다.) 근데 엄청난 착각을 하고 있었다. A객체는 B객체를 Lazy하게 가져온다고 했을 때, 그래프 탐색이 가능한 범위의 레이어는 컨트롤러단 까지라고 생각했다. 뷰단에서는 막연하게 응답 이후에 처리 된다고 생각했는데, 스프링MVC 구조를 떠올리지 못했다. 위의 사진은 스프링 MVC의 구조를 잘 나타내고 있다. 요청부터 응답까지 어떤 과정으로 되어 있는지 도식화 해두었다. A객체가 B객체의 그래프 탐색이 가능한 범위는 위의 사진에 나와있는 모든 단계에서 가능..
메소드(함수) 호출 방식 프로그래밍 언어에서 변수를 다른 함수의 인자로 넘겨 줄 수 있습니다. 이 때 이 변수의 '값'을 넘겨 주는 호출 방식을 Call by Value, 이 변수의 '참조값' (혹은 주소, 포인터)를 넘겨 주는 호출 방식을 Call by Reference라고 합니다. (이외에도 Call by Assignment, Call by Name 등의 개념이 있다고 들었습니다.) 자바는 Call by Value 방식으로 동작하게 되는데 이를 증명 해 볼 수 있는 대표적인 예제가 변수의 값을 바꿔보는 함수(메소드)가 있습니다. public static void main(String[] args) { int a = 1; int b = 2; swap(a, b); System.out.println(a);..
개요 변경된 파일들을 확인하고 스테이지에 올리기 위해서는 git add라는 명령어를 사용하게 됩니다. 그리고 스테이지에 올리기 전에 변경된 파일과 코드들을 확인해 보기 위해서는 git status (변경된 파일 상태보기), git diff (스테이지에 올라가지 않은 파일들의 변경사항 보기) 명령어로 판단 할 수있습니다. 하지만 여러 파일을 수정하고 스테이지에 올리는 경우, 커밋 의도에 맞는 변경 사항이 적용 됐는지 일일이 확인하는 것은 상당히 귀찮은 일이고, 스테이지에 올리지 않게 수정하거나, 스테이지에 올라갈 파일들만 골라내는 작업도 시간을 많이 소모하게 됩니다. 이러한 문제는 git add를 사용하지 않고 git add -p라는 명령어를 사용하면 쉽게 해결 할 수 있습니다. git add -p git..
로그인 여부 & 권한 여부 확인하기 로그인 하지 않은 사용자에게 '로그인' 메뉴가 노출되지만, 로그인 한 사용자에게는 '로그인' 메뉴가 사라지고, 혹은 관리자 권한을 가진 유저에게만 관리자페이지로 가는 메뉴를 노출해야 하는 일은 프론트 구현 과정에서 필수적인 과정이다. 기존에는 세션을 이용하여서 직접 유저의 권한과 로그인 여부를 확인했었지만 스프링 시큐리티를 적용했기 때문에 이런 과정도 스프링 시큐리티를 이용하여서 진행해야 했다. 1. MAVEN 의존성 설정 기존에 타임리프를 사용하기 위한 의존성 이외에 추가적으로 아래와 같은 의존성을 설정해야 한다. org.thymeleaf.extras thymeleaf-extras-springsecurity5 3.0.4.RELEASE 2. SpringSecurityD..
이왕이면 다홍치마 백엔드 개발자들을 꿈꾸는 학생(?)들이 모여서 하는 프로젝트라고 하지만 프론트(뷰)단이 너무 못생기면 어디 내놓기가 많이 민망하다. 이런 문제를 쉽게 해결해 주는 것이 부트스트랩인데, 쉽게 생각하면 디자인을 무난하게 일정 수준의 품질로 나오게 할 수 있는 css의 모임? 이라고 볼 수 있다. 사실 이전 미니 게시판 프로젝트는 부트스트랩보다 좀 더 세련 되 보이는 semantic-ui를 사용 했었는데, 바로 적용 할 수 있는 테마가 적어서 부트스트랩으로 선회했다. 테마 고르기 테마를 고르는 기준은 심플하고 깔끔한 디자인 이였다. 아무리 좋은 테마라도 결국 다른 목적의 웹사이트로 바뀌기 위해서는 커스터마이징은 필수로 진행된다. 화려한 테마일 수록 커스터마이징이 힘들 것으로 예상될 것 같아 ..
For-each vs For 자바에서 For-each 문이 전통적인 For문보다 더 빠르다는 정도만 알고 있엇는데, 특별하게 ArrayList에 경우는 오히려 For문이 더 빠르다는 얘기를 듣게 되었습니다. 실제로 얼마나 차이가 나는지 알아보고자 성능 테스트를 시도해보았습니다. 참고로, 여기서 말하는 For-each문과 For문은 아래와 같은 2가지 경우의 반복문을 말합니다. //For-each문 for (Integer integer : list) { integer++; } //For문 for (int i = 0; i < list.size(); i++) { Integer integer = list.get(i); integer++; } 테스트 코드 사이즈가 100인 List를 순차적으로 탐색해보았습니다. ..
Minimum Path Sum ☞ 문제링크 크기가 m,n인 2차원 배열의 좌측 상단(0,0)부터, 우측 하단(m-1,n-1) 까지 이동하는데, 이동 경로의 배열 값들을 모두 더하게 되는 경우, 이 값의 최소 값을 구하는 문제입니다. 예시로 들어둔 배열은 아래와 같습니다. 괄호안에는 좌표를 표시했습니다. 1 (0,0) 3 (0,1) 1 (0,2) 1 (1,0) 5 (1,1) 1 (1,2) 4 (2,0) 2 (2,1) 1 (2,2) 각 좌표들의 최소 합은 다음과 같이 구할 수 있습니다.좌표가 0,0 인 경우는 항상 그 좌표의 값과 같습니다. (경우의 수가 1개)좌표가 (0,x) 혹은 (x,0) 처럼 0이 들어가는 경우도 경우의 수가 1개 뿐입니다. 바로 이전의 좌표 값만 더해주면 됩니다. 예를들어 0,1의 ..
의존하는 객체가 자주 변하는 경우 Soldier(군인)이라는 클래스와 Gun(총)이라는 클래스가 있고, Soldier클래스는 Gun클래스를 의존하고 있다고 가정해봅시다. 이런 경우를 코드로 간략하게 나타내면 아래와 같습니다. class Soldier{ . . . Gun gun = new Gun(); . . . } 하지만 Soldier입장에서, 사용하는 무기가 Gun이 아닌 다른 경우가 존재 할 수 도 있습니다. 예를 들어, Sword(검)이라던지, Bow(활) 같은 경우입니다. 그럼 매번 의존하는 무기가 변경 될 때 마다 코드를 변경 해주어야 합니다. Soldier의 무기가 Sword로 변경 되어야 하는 경우 class Soldier{ . . . Sword sword = new Sword(); . . ...