막 어려운 문제라기보다는, 생각의 전환을 잘 하고 싶어서 글을 적게 된 문제이다. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/132266?language=java 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 내가 푼 풀이 처음에는 dfs + dp를 이용해서 문제를 풀려고 했었다. 이전에 갔던 길이라면, 최단거리를 다시 구할 필요가 없기 때문이다. 이렇게 하니 답은 나왔지만, 시간 초과가 떠서 맞지 못했다. 아래는 그 dfs 코드이다. 이미 최단거리를 구했던 곳이라면 더이상 가지않고 최단거..
상속과 다형성, Override는 자바의 객체지향에 있어서 중요한 개념들이다. 어느정도 개념은 알고 있지만, OS관점? 메모리 구조 관점에서 보았을 때, 어떤식으로 작동이 되는 지 원리를 알고 싶었고, 공부하게 되었다. 상속 상속관계인 클래스에서는 자식 클래스가 부모 클래스의 변수와 메서드를 사용할 수 있다. 이게 어떻게 가능한걸까? JVM 메모리 구조에는 Runtime Data Area가 있다. 프로그램 수행을 위해 OS로부터 별도로 할당받은 메모리 공간이며, PC 레지스터, JVM 스택, Native 메서드 스택, 메서드 영역, 힙으로 공간이 나뉘어져있다. 자세한 내용은 아래 글을 참고하면 된다. [ Java ] JVM란? 자바의 실행 원리 알아보기 1. JVM이란? JVM은 자바 가상 머신으로 Ja..
메모리 구조에 대해서 어렴풋이만 알고 있는 것 같아 제대로 정리해보려고 합니다. 주 메모리 메모리는 크게 커널(kernal) 영역과 유저(User) 영역으로 나뉘어지고, 커널 영역에는 운영체제가 적재되고 유저 영역에는 일반 프로세스가 적재됩니다. 프로그램이 실행되기 위해서 프로그램이 주 메모리(RAM)에 load되어 프로세스가 되어야합니다. 또한, 프로그램 중에 사용할 변수와 데이터들을 메모리에 저장하여 사용합니다. 유저 영역에 적재되는 프로세스의 메모리 구조는 아래와 같습니다. 유저 영역 메모리 구조 메모리 구조는 크게 코드, 데이터, 힙, 스택 영역으로 나뉩니다. 운영체제가 실행 프로그램을 위해서 공간을 4가지로 할당해줍니다. 1) 코드(Code) 영역 실행할 프로그램의 코드가 저장되는 영역으로 텍스..
이전에 진행했던 프로젝트에서 JWT 로그인을 구현하였습니다. JWT 로그인에는 Access-Token과 Refresh-Token이 쓰입니다. 한마디로 표현하면, 액세스 토큰은 인증을 위한 토큰, 리프레시 토큰은 액세스 토큰을 재발급하기위한 토큰입니다. 리프레시 토큰은 서버에서 만들어서 MySQL에 저장하고, http 쿠키로 생성하여 프론트엔드로 넘겨주었습니다. 그런데 프로젝트 리팩토링을 진행하면서, MySQL에 저장했던 리프레시 토큰을 Redis로 바꾸려고 합니다.!! 왜 Redis로 바꾸는 것이 좋을 지에 대해 정리해보겠습니다. Redis 란? Redis(Remote Dictionary Server)는 [키(Key) - 값(Value)] 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이..
1. 특성 (ACID) 1) 원자성 (Atomicity) - 한 트랜잭션 내 모든 연산들이 완전히 수행되거나 전혀 수행되지 않아야함 (all or nothing) - DBMS의 회복 모듈 : 시스템 다운이 될 경우, 트랜잭션의 영향을 취소함으로써 원자성 보장 2) 일관성 (Consisitency) - 어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 새로운 일관된 상태를 가짐 - DBMS의 무결성 제약 조건, 동시성 제어 모듈 3) 고립성 (Isolation) - 한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야함 - 다수의 트랜잭션들이 동시에 수행되더라도 그 결과..
1. 삽입 정렬 (Insertion Sort) 설명 이미 정렬이 된 부분과 되지 않는 부분을 나누면서 정렬한다. 배열의 앞의 요소부터 차례대로 이미 정렬이 된 부분과 비교하여, 적합한 위치를 찾아 삽입하는 알고리즘이다. 두번째 요소부터 왼쪽의 요소들(이미 정렬이 된 부분)과 비교하여 삽입 위치를 찾아야한다. 이미 정렬이 된 부분과 비교연산을 할때는, 왼쪽으로 옮겨가며 비교를 하여 삽입 위치를 찾는다. 예시 1. [5, 3, 8, 1, 2, 7] → 두번째 원소인 3과 왼쪽의 이미 정렬된 배열인 [5] 와 비교 - 3과 5를 비교했을 때 5보다 작기 때문에 5를 한칸 뒤로 이동 : [3, 5] 2. [3, 5, 8, 1, 2, 7] → 세번째 원소인 8과 왼쪽의 이미 정렬된 배열인 [3, 5] 와 비교 -..
SWEA에서 모의 역량테스트 문제 풀어보다가 신기한?흥미로운? 문제를 발견해서 적어보려고한다. 또, 내가 푼 방법은 다른사람들이 주로 푼 방법과는 달라서 두가지 방법을 모두 정리해보려한다. 문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRJ8EKe48DFAUo&categoryId=AWXRJ8EKe48DFAUo&categoryType=CODE&problemTitle=%EB%AA%A8%EC%9D%98&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 SW Expert Academy SW 프로그래밍 역량 강화에 도움이..
오랜만에 자료구조를 직접 구현해보는 연습을 해보고있다. 스택은 자주 사용하는 자료구조이며, 어느정도 개념도 잘 알고 있다보니 직접 구현하는 게 어렵진 않았다. 그래서 나 스스로에게 미션(?)을 부여하면서 구현해보았다. 첫번째는, 제네릭을 사용해서 구현할 것. 두번째는, 스택의 구성은 배열과 링크드리스트 두가지 버젼을 구현해볼것. 이를 구현하기 위해서 인터페이스를 사용했다. 보통 스택에서 사용하는 메소드들을 인터페이스를 통해 선언해놓고 배열 스택과 링크드리스트 스택에서 구현하도록 했다. 역시 이때 요소의 타입은 제네릭을 사용하여 지정하도록 하였다. Stack public interface Stack { boolean add(E data); E pop(); E peek(); E get(int idx); bo..
오랜만에 손코딩 연습도 해볼겸 개념정리도 한번 할겸 자바로 링크드리스트를 구현해보았다. 링크드리스트는 노드가 연속적으로 다음 포인터를 가지고 있는 자료구조이다. 링크드 리스트의 개념이나 특징을 공부한 후에 구현해보는 것을 추천한다! 처음에는 데이터 타입을 그냥 가장 상위 클래스인 Object 클래스로 구현해보았다. 그렇게 하면 여러개의 다른 데이터 타입을 넣을 수는 있겠지만, 하나의 데이터 타입으로 고정할 수가 없었다. (예를 들면 자바 라이브러리 util에 있는 자료구조들처럼..) 그래서 제네릭 타입으로 구현하여 호출하는 쪽에서 타입을 지정하고, 다른 타입을 파라미터로 넣으면, 컴파일 오류가 나게하여 더 좋은 코드를 작성해보았다. 일반적으로, 컴파일 오류가 나게끔 하는 게 더 좋은 코드이다. 런타임 오..
요즘 프로젝트 리팩토링을 하면서, DTO에 작성하는 여러개의 lombok 어노테이션의 사용 이유를 정확히 알지 못하고 사용하는 것 같아서 하나하나 고찰(?) 해보기로 했다. 일단, DTO는 Data Transfer Object로, REST API 작성 시에 엔티티 대신에 DTO를 사용하여 컨트롤러에서 데이터를 주고받는 용도로 사용한다. DTO를 사용하면 엔티티에 변질을 막을 수 있고, 로직에 맞춰 필요한 필드만 주고받을 수 있어 DTO를 사용하는 것이 좋다. 컨트롤러에서 DTO를 주고받기 때문에 JSON 직렬화와 역직렬화가 일어난다. - 직렬화(serialization) : Java Object 가 JSON으로 변환되는 것으로, ResponseBody를 사용할 때 일어난다. (서버 -> 클라이언트) - ..