목록Study/닥치는 대로 주워 담기 (87)
일단 씻고 나가자
2023. 11. 07 화요일 - [Spring] HTTP protocol이란? 형식? : Hyper Text Transfer Protocol. 직역하면 하이퍼 텍스트를 전송하기 위한 규칙이다. 예전엔 하이퍼 텍스트(링크)와 일반 텍스트를 전송하기 위한 규약이었으나, 시대의 발전에 따라 html, 마크업 랭귀지 등을 담았고 이젠 JSON 형태의 데이터를 송수신할 때 사용된다. Request 요청 라인 : HTTP 메서드 / 요청된 url / HTTP 버전 (스펙) ex) GET /api?request=param HTTP/1.1 헤더 : Content-Type (보내는 데이터의 형태) / Accept (받기를 원하는 데이터의 형태) ex) application/json 바디 : 요청할 실제 데이터 Resp..
2023. 11. 01 수요일 - MST와 최단 경로 알고리즘 차이? 종류? : MST는 Minimun Spanning Tree이며, 이때 Spanning Tree는 사이클 없이 모든 정점이 n-1개의 간선으로 연결된 그래프. 최단 경로 알고리즘은 특정 노드에서 다른 특정 노드로 가는 길을 최소의 비용으로 가는 방법을 찾는 것. 둘은 목적이 다르다. MST는 전체적으로 최소의 비용을 고르기에, 최단 경로 알고리즘처럼 특정 노드에서 다른 특정 노드로 가는 최소 비용을 보장하지 않는다. MST는 무향 그래프에서만 동작하며, 최단 경로 알고리즘은 유, 무향 모두 동작한다. MST 1. 크루스칼 – 간선 중심 // 최소 가중치의 간선으로 정렬 후 순서대로 두 노드의 부모를 같게 만들어줌. 2. 프림 – 노드 중..
2023. 10. 31 화요일 - [Spring] Exception을 처리하는 방법? : 스프링에서 예외를 처리하는 방법은 (REST API) 다음과 같다. 만약 Exception을 handle을 해주지 않으면 기본적인 에러 페이지를 발생시키므로, 구체적인 에러의 내용과 처리를 위해 handle은 중요하다. 기본적으로 JSON 형태로 보내는 것이 좋은 이유는, 직렬화의 이점과 요새는 JSON을 해석하는 해석기도 없는 곳이 없으므로 호환이 좋다. ResponseEntity는 스프링에서 제공하는, 응답 시의 방법 중 하나. http status나 header, body를 자유롭게 설정할 수 있다. 따라서 아래의 @ResponseStatus는 ResponseEntity로 대체 가능. 예외 처리의 우선순위는 정..
2023. 10. 30 월요일 - [Effective Java] 메서드 작성 시 주요 사항? (메서드 명, 편의 메서드, 파라미터, boolean) : 메서드 명은 표준 명명규칙을 지키되, 현재 소속되어 있는 그룹의 컨벤션을 지키는 것이 중요하며, 메서드 명이 길어질 경우 심각한 가독성 혼란을 일으킬 수 있으므로 대체하는 방법이 필요하다. (JPA의 경우 Query 어노테이션으로 대체하거나) 편의 메서드(Util, 혹은 클래스 내부에서 활용)는 되도록 사용하지 않는 것이 좋다. 클래스 내에서 많이 사용할 경우 그것은 private 메서드일 확률이 높다. 웬만하면 먼저 메서드 내에 선언하여 활용하고, 필요하다면 분리하자. 파라미터의 경우 개수가 적어야 하고 같은 타입은 지양해야 한다. 그럴 경우 객체로 파..
2023. 10. 26 목요일 - [Effective Java] Date의 문제점? 해결 방법? : Date는 불변 객체가 아니기 때문에 (set으로 원본을 바꿀 수 있음) 문제가 생길 수 있다. LocalDateTime 불변 객체를 사용하거나, 방어적 복사로 원본을 항상 보관해야 한다. 이는 Date뿐 아니라 다른 불변 객체가 아닌 객체를 사용할 때도 방어적 복사를 사용. 수정하지 않을 것이라면 상관없지만, 수정할 것이라면 방어적 복사. - [Spring] controller란? 관련 어노테이션 설명? Controller – 외부의 요청을 처리. 스프링 MVC에는 어노테이션으로 활용. 예전엔 @Controller도 있었는데, 예전에 썼던 어노테이션. 예전엔 프론트-백의 경계가 희미했기에, HTML 템플..
2023. 10. 25 수요일 - [Effective Java] 매개변수 유효성을 검사하는 위치, 유의점? : 매개변수 유효성은 최대한 앞단에서 검사하는 것이 좋으며, 어노테이션 및 controller단에서 검사하는 때도 있고, 로직 상에서 검사한다면 fast failed로 먼저 실패 케이스를 검사하는 것이 좋다. 이유는 로직 중간에 검사를 진행하면 로직을 수행하다 예외를 발생시켜 쓸데없는 자원을 소모할 수도 있고, 데이터베이스 저장 중 실패되어 크리티컬한 에러가 발생할 수 있기 때문이다. 또한 회사 내부적(프론트 – 백 혹은 서버 – 서버)으로 사용하는 api가 아닌 경우 다른 사용자들에게 많은 호출 공격이나 sql injection 등으로 공격을 받을 수 있으므로, 공개된 API라면 더더욱 파라미터에..
2023. 10. 24 화요일 - [Effective Java] 병렬화가 무조건 속도가 빠를까? : 꼭 병렬화라고 빠른 속도를 보장하는 것은 아니다. Java에서 제공하는 ForkJoinPool을 예시로 들면, 각 상위의 스레드가 하위의 자식 스레드를 fork 하는데, 이때 fork를 하는 것도 자원이 소모될뿐더러 하위의 모든 스레드가 작업을 완료해야 상위로 넘어가기 때문에 limit 같은 연산 시 결국 모든 계산을 기다려야만 한다. 또한 외부 API의 이용 같은 경우에도, 외부 API가 일정 수의 호출 이상을 거절하거나 했을 때 에러를 발생시킬 수 있으므로 외부 요인 또한 체크하여야 한다. 즉, 병렬이 무조건 빠르다고 생각하여 아무 곳이나 적용하지 말고 상황, collection 등을 검토해보아야 한다..
2023. 10. 23 월요일 - hierarchy란? 메모리 하이라키란? : 일반적으로 계층 구조를 의미한다. 메모리 하이라키란 메모리 계층 구조를 의미하며, 일반적으로 CPU를 중심으로 접근이 빠른 순으로 표현한다. 저장매체를 기준한다면 레지스터, CPU 캐쉬, 메인 메모리, RAM 순으로 일컫는다. - 내부 단편화, 외부 단편화란? : 내부 단편화란 응용 프로그램에게 할당한 메모리가 응용 프로그램의 메모리보다 커서 남게 되는 상황이며, 외부 단편화란 응용 프로그램의 크기만큼 메모리를 제공하고 회수하는 과정을 거쳤을 때 중간중간의 작은 잔여 메모리들의 합은 크지만 연속적인 공간이 아니어서 다른 큰 메모리를 할당할 수 없는 상황. - [Spring] 스프링에서 외부 리소스를 참조하는 방법? : Reso..
2023. 10. 19 목요일 - [Effective Java] stream의 유의점? Map으로 변환하는 2가지 방법? : stream은 순수함수이기 때문에, 외부의 객체를 변경하는 로직은 안 좋다. (ex. forEach로 for문을 대신하여 stream 외부의 list를 변경하거나) stream을 Map으로 변경하는 방법은 toMap, groupingBy 두 가지가 있다. new ArrayList().stream().collect(Collectors.toMap(User::getName, User::getAge)) new ArrayList().stream().collect(Collectors .groupingBy( user -> ((int) user.getHeight / 5 * 5), Collecto..
2023. 10. 18 수요일 - [Effective Java] stream을 사용하지 못할 상황과 사용해야 할 상황? : stream의 전제는 순수 함수임을 전제하고, 외부 (변수 등)에 변화를 주는 상황에서 사용하면 안 된다. (premitive 타입은 변경이 불가하지만, boxing된 타입은 변경 가능) stream의 사용이 적절한 경우는 다음과 같다. 원소의 시퀀스를 일괄 변환 (컬렉션 전체를 다른 타입으로 변경) 필터링 시퀀스를 하나의 연산을 통해 결합 (sum()) 시퀀스를 컬렉션이 모음 시퀀스에서 특정 조건을 만족하는 원소를 찾음 - [Effective Java] findFirst/Any() 차이? : first는 모든 연산이 끝난 후 결과 도출, any는 찾았다면 연산을 끝내고 결과 도출.