[TIL] DTO

책에서는 서비스단에서 dto를 매개변수로 많이 쓰고 있는데, 규모가 커졌을때, 그리고 서로 엮었을 때를 생각하면, dto를 매개변수를 받는게 치명적일 수 있다라는 것을 듣게 된 후, Dto에 대해서 다시 한번 정리하게 되었다. DTO(데이터 전송 객체) DTO <-> Entity 어떻게 할까 ? @Getter @NoArgsConstructor @Entity public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) private long id; private String name; private String password; private String email; @Builder public User(String name,...

[TIL] IntelliJ - JIRA 연동

IntelliJ - JIRA 연동하기 File > Settings… > Tools > Tasks > Servers 경로로 이동 [+] 버튼을 클릭하여 [JIRA] 선택 설정 창에서 본인이 사용하는 JIRA URL과 계정 정보를 입력한 뒤 [Test] 클릭 [Connection is successful] 문구가 보이면 연동 완료이므로 [OK] 클릭 윈도우 기준으로 [Alt + Shift + N] 단축키를 누르면 본인에게 할당된 task를 확인할 수 있고, 브랜치명이나 Commit Message도 변경할 수 있다. 마지막으로, [Alt +...

[TIL] SQL 다국어 데이터 깨짐 현상 해결

SQL 다국어 데이터 깨짐 현상 현재 사용 중인 DB는 oracle이며, 이미 생성되어 있는 테이블에 다국어 데이터를 insert할 수도 있다고 들었다. 일단 현재 DB의 CHARACTERSET 속성을 봐야되는데 일단 조회해본다. (현재 데이터셋은 CharacterSet K016MSWIN949 이였다.) SELECT * FROM nls_database_parameters WHERE parameter LIKE ‘%CHARACTERSET%’; ру́сский язы́к라는 러시아어 데이터를 insert 후 정상적으로 데이터가 적재되었는지 확인하였으나 실제 확인된 데이터는 ?(물음표)가 포함되어 있는 비정상적인 형태로 데이터의 깨짐 현상이 보였다. 원인 분석...

[TIL] Entity 설계 시 ID값은 왜 Long일까?

토이 프로젝트를 하다가, JPA Entity 설계 시 ID값은 왜 Long으로 했나요?? 라는 질문에 나는 답을 할 수 없었다…. 왜냐하면 JPA Entity 설계시 관련 강의나 책에서 Long으로 지정하고 있어서 나는 그냥 따라서 기계적으로 만들었던거였다. ( 그땐 왜 안궁금했지? ) 왜? Entity 설계시 ID 값을 Long으로 지정하는지? 이유를 찾아봤다. int, long이 아닌 Wrapper Class(Long)를 쓰는 이유 int, long이 아닌 Wrapper Class(Long)를 쓰는 이유는 null을 사용할 수 있기...

[TIL] MethodArgumentNotValidException, ConstraintViolationException

@ControllerAdvice로 예외처리를 만들고 테스트를 하다가 @Valid는 MethodArgumentNotValidException 예외처리를 발생한다고 하던데 MethodArgumentNotValidException이 발생하지 않고 ConstraintViolationException로 계속해서 에러를 발생하고 있어서 왜 그러지…? 하고 생각을 하고 있었다. MethodArgumentNotValidException 예외는 주로 DTO 필드에 붙은 @NotNull 어노테이션과 컨트롤러 파라미터 앞에 붙은 @Valid 어노테이션을 통해 던져진다. @NotNull 어노테이션을 DTO 필드에 붙여두어도, `해당 DTO를 받아내는 메서드 파라미터 위치에 @Valid 어노테이션을 추가하지 않으면 검증이 동작하지 않는다.` 라는 글을 보게되었고.. 나는 DTO에 @NotNull과 같은...

[TIL] @ControllerAdvice

AOP를 이용한 예외처리 - @ControllerAdvice 하나의 클래스로 모든 컨트롤러에 대해 전역적으로 예외 처리가 가능함 직접 정의한 에러 응답을 일관성있게 클라이언트에게 내려줄 수 있음 별도의 try-catch문이 없어 코드의 가독성이 높아짐

[TIL] 프로젝트 방법론

토이 프로젝트를 진행하면서 프로젝트 관리는 지라 툴을 사용하기로 했다. 지라는 회사에서 프로젝트 할때 사용은 해봤지만 직접 구성을 해본적도 없어서 거의 안써본거랑 같다…. 이번 기회에 구성도 하면서 제대로 사용해보기로 했다. 맨 처음 지라를 만들때 칸반 보드와 스크럼 보드로 나뉘어졌다. 애자일 방법론을 얘기할때 꼭 나오는 것이 지라인만큼 칸반 보드와 스크럼 보드가 애자일 방법론 중에 하나인것을 알게 되었다. 이참에 프로젝트 방법론까지 정리를 해봤다. 프로젝트 방법론 1. Waterfall Model...

[TIL] 빌더패턴을 쓰는 이유

토이 프로젝트를 하면서 빌더 패턴을 사용을 하고 있는데 왜 쓰는지? 에 대해서 한번 정리를 해봤다. setter 대신 Builder Entity 클래스에는 절대로 setter를 쓰지 않는다. 그럼, 어떻게 setter가 없는데 값을 채워서 DB에 insert를 할까?? 기본적인 구조는 생성자를 통해서 값을 채운 후 DB에 insert를 한다. 값 변경이 필요하면 해당 메소드를 호출하여 변경한다. 즉, 생성자 대신에 빌더를 통해 제공되는 빌더 클래스를 사용한다. 빌더 패턴을 사용하면 어떤 필드에 어떤...

[TIL] GitHub를 통한 협업

pull, push만 해보고 제대로 사용하고 있지 않았던 git.. 이번에 프로젝트를 시작하면서 몰랐던 것들을 하나씩 정리했다. Local & Remote 편의상 로컬 머신에 존재하는 모든 repository는 local이고 GitHub에 존재하는 모든 repository는 remote라고 한다면, 우선 로컬에 repository를 만드는 방법은 위에서 말한 것처럼 크게 두 가지가 있다. A. 로컬에서 git init으로 새로운 git repository 생성 B. 깃허브에서 새로운 repository를 만든 후 git clone해서 가져오기 이렇게 만든 local과 remote는 모두...

[TIL] Integer ArrayList -> int 배열 변환

for문을 통해서 변환하는것에만 익숙해서 스트림으로 변환하는 방법을 찾아봤다. public static void main(String args[]) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); // 방법 1 int[] arr1 = new int[list.size()] for (int i = 0 ; i < list.size() ; i++) { arr1[i] = list.get(i).intValue(); // 방법 2 int[] arr2 = list.stream() .mapToInt(i -> i) .toArray(); // 방법 3 int[] arr3 = list.stream() .mapToInt(Integer::intValue) .toArray();...

[강의] 예제로 배우는 스프링 입문(IoC, DI)

IoC (제어의 역전) 일반적인 (의존성에 대한) 제어권: 내가 사용할 의존성은 내가 만든다. => 보통은 new OwnerRepository(); 생성. class OwnerController { private OwnerRepository repository = new OwnerRepository(); } IoC: 내가 사용할 의존성을 누군가 알아서 주겠지 (내가 new로 생성하지 않는다.) 1. 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤거든 상관없다. 2. 그래야 코드 테스트가 편하다. class OwnerController { private OwnerRepository repo; public OwnerController(OwnerRepository repo) { // DI :...

[TIL]Queue add VS offer

큐 관련 알고리즘 풀다가 다시 한번 정리해봤다. Queue 에러발생 추가 add(e) 삭제 remove 검사 element Queue true, false 리턴 추가 offer(e) 삭제 poll() 검사 peek() 정리 add는 큐가 꽉 찾을 때 추가 할 수 없는 경우 에러 출력 offer는 false를 리턴

[책]토비의스프링_6장_AOP

스프링 AOP 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 애스펙트 지향 프로그래밍 또는 약자로 AOP(Aspect Oriented Programming)이라고 한다. ( => 관점 지향 프로그래밍) AOP는 OOP를 돕는 보조적인 기술이지 OOP를 완전히 대체하는 새로운 개념이 아니다. AOP는 결국 애플리케이션을 다양한 측면에서 독립적으로 모델링하고 설계하고 개발할 수 있도록 만들어주는 것이다. AOP를 이용해 트랜잭션 속성을 지정하는 방법에는 포인트컷 표현식과 메소드 이름 패턴을 이용하는...

[알고리즘] 우선순위큐

우선순위 큐 PriorityQueue란 우선순위 큐로써 일반적인 큐의 구조 FIFO(First In First Out)를 가지면서, 데이터가 들어온 순서대로 데이터가 나가는 것이 아닌 우선순위를 먼저 결정하고 그 우선순위가 높은 데이터가 먼저 나가는 자료구조이다. 낮은 숫자가 우선 순위인 int 형 우선순위 큐 선언 PriorityQueue<Integer> priorityQueueLowest = new PriorityQueue<>(); 높은 숫자가 우선 순위인 int 형 우선순위 큐 선언 PriorityQueue<Integer> priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder()); 해당 큐의 맨 앞에 있는(제일 먼저 저장된)...

[TIL]비동기 메세징

비동기 메세징 메세징은 서비스 간 메세지를 통해 비동기적으로 주고 받는 통신 방식. 메세징은 브로커라는 인프라 서비스의 이용 유무에 따라 나뉜다.(찾아보기) 브로커 기반 메세징 모델은 송신자,메세지 채널,수신자로 구성되며 송신자와 수신자 간 메세지 채널을 통해 메세지를 교환한다. 송신자는 메세지 채널에 메세지를 쓰고 수신자는 메세지 채널에 메세지를 읽는다. 메시지란? 메시징 서비스에서 송신자와 수신자 간 교환되는 데이터 단위. 메시지는 헤더와 바디(본문)으로 구성된다. 메세지의 종류에는 document, command, event가 있고 document...

[TIL] Queue의 구현체는 왜 LinkedList일까?

스택, 큐 관련 알고리즘 문제를 풀다가 큐의 구현체는 왜 LinkedList로 만드는지 궁금해서 찾아봤다. 일단 LinkedList와 ArrayList의 차이부터 정리해보자면, LinkedList와 ArrayList의 차이 ArrayList는 index가 있고, LinkedList는 각 원소마다 앞,뒤 원소의 위치값을 가지고 있다. 이러한 각각의 특징은 조회, 삽입, 삭제시에 성능의 차이가 발생된다. ArrayList ArrayList는 기본적으로 배열을 사용한다. 하지만 일반 배열과 차이점이 존재한다. 일반 배열은 처음에 메모리를 할당할 때 크기를 지정해주어야 하지만, ArrayList는 크기를 지정하지 않고 동적으로...

[책]스프링 부트와 AWS로 혼자 구현하는 웹 서비스

스프링 부트에서 테스트 코드를 작성하자 TDD와 단위테스트는 다른 이야기이다. TDD는 테스트가 주도하는 개발이다. 테스트 코드를 먼저 작성하는 것부터 시작이다. 단위테스트를 배우기 전 1. 코드를 작성 2. 프로그램(tomcat) 실행 3. Postman과 같은 API테스트 도구로 Http 요청 4. System.out.println() 눈으로 검증 5. 결과가 다르면 프로그램(tomcat) 중지 후 코드 수정 2~5번은 매번 코드를 수정할때마다 반복해야한다. 테스트 코드를 작성하면 자동검증이 가능하고 [중요] 새로운 기능을 추가했을 시 기존 기능이 잘...

[프로젝트]WEB취약점 U-12, U-29

프로젝트 진행을 하다가 WEB취약점 U-12, U-29가 발견됐다고 해서 조치를 해야하는데 처음 들어보는 문제들이라서 구글링을 하면서 하나씩 해결해봤다. U-12(하) 계정이 존재하지 않는 GID 금지 ○ 점검개요 : 그룹(예 /etc/group) 설정 파일에 불필요한 그룹 (계정이 존재하지 않고 시스템 관리나 운용에 사용되지 않는 그룹, 계정이 존재하고 시스템 관리나 운용에 사용되지 않는 그룹 등)이 존재하는지 점검 ==> 해당 그룹 삭제. groupdel [그룹명] ex) groupdel printadmin U-29(상) 접속 IP 및...

[알고리즘]유클리드 호제법

유클리드 호제법으로 최대공약수 구하기 최대공약수(GCD, Greatest Common Divisor) private int GCD(int x, int y) { if(y == 0) { return x; } else { return GCD(y, x % y); } } 1. GCD(22, 8)로 실행 2. GCD(8, 22 % 8) -> GCD(8, 6) 3. GCD(2, 6 % 2) -> GCD(2, 0) 4. 매개변수 y의 자리에 0 => if문 조건에 걸림 5. return x; (x의 값이...

[강의]스프링 부트와 JPA 활용2 - 컬렉션 조회 최적화

컬렉션 조회 최적화 XToOne 관계에서는 fetch join으로 쿼리수를 최적화한다. 컬렉션은 fetch join 시 페이징이 불가능하다. 컬렉션은 fetch join 대신에 지연로딩을 유지하면서 hibernate.default_batch_fetch_size , @BatchSize 로 최적화한다. 권장 순서 1. 엔터티 조회 방식으로 우선 접근한다. 1. fetch join으로 쿼리 수를 최적화한다. 2. 컬렉션 최적화 1. 페이징 필요 : hibernate.default_batch_fetch_size , @BatchSize 로 최적화한다. 2. 페이징 필요X : fetch join을 사용한다. 2. 엔티티 조회방식으로 해결이 안되면 DTO조회방식으로...