목록분류 전체보기 (297)
가수면
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tJzHH/btsCTWd6pei/wy52hnaEus77ny36nA1wT1/img.png)
HATEOAS HATEOAS (Hypermedia as the Engine of Application State) RESTful 웹 서비스 디자인의 핵심 원칙 중 하나 클라이언트가 서버와 상호 작용할 때 필요한 모든 정보를 응답에 포함시켜야 한다는 것을 의미 사용자가 다음에 무엇을 할 수 있는지 알 수 있도록 응답 내에 관련 링크와 옵션을 제공한다. 예) 사용자 프로필을 반환할 때, 응답에 사용자 프로필을 수정하거나 삭제할 수 있는 링크도 포함 1. 의존성 설치 org.springframework.boot spring-boot-starter-hateoas 2. api에 다른 링크 포함 시키기 예시 응답 모양) 응답과 같은 모양을 HAL이라고 함 { "name": "Adam", "birthDate": "1..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/3wFKs/btsCxCPqMVx/8wFG22KsuGk7kIK11ozC8k/img.png)
springdoc openapi로 검색해 깃허브 페이지로 이동 https://github.com/springdoc/springdoc-openapi GitHub - springdoc/springdoc-openapi: Library for OpenAPI 3 with spring-boot Library for OpenAPI 3 with spring-boot. Contribute to springdoc/springdoc-openapi development by creating an account on GitHub. github.com springdoc-openapi-starter-webmvc-ui의 pom.xlm를 참고해 의존성 설치 이때 SNAPSHOT이 아닌 버전으로 하나 다운그레이드해서 사용하길 권장 or..
200 - 요청 성공: 요청이 성공적으로 처리됨.201 - 생성 성공: 요청에 따라 새로운 리소스가 성공적으로 생성됨.204 - 콘텐츠 없음: 요청은 성공했지만, 보내줄 콘텐츠가 없음.301 - 영구적 이동: 요청한 리소스가 영구적으로 새 위치로 이동됨.302 - 임시적 이동: 요청한 리소스가 임시적으로 다른 위치로 이동함.400 - 잘못된 요청: 서버가 요청을 이해할 수 없음(유효성 문제 등).401 - 인가 오류: 요청이 인증되지 않음.403 - 금지됨: 서버가 요청을 이해했으나 승인을 거부함.404 - 리소스가 없음: 요청한 리소스를 찾을 수 없음.405 - 메소드 허용되지 않음: 요청한 메소드가 서버에서 허용되지 않음.409 - 충돌: 서버가 요청을 처리하는 과정에서 충돌이 발생422 - 처리할 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cegr9u/btsCjZj4Bwh/NhjD4evdf6bn5dvbPQVrKK/img.png)
정적 데이터 기준 GET 1-1. 베이스가 되는 클래스 생성 1-2. 필드로 사용될 변수들 지정 1-3. 필드 생성, 게터와 세터, toString 생성 일반적으로 entity를 만들 때 생성자를 명시적으로 생성하지 않더라도 컴파일러가 기본 생성자를 자동 생성해주지만, 만약 사용자 정의 생성자가 하나라도 존재한다면 아래처럼 기본 생성자를 명시적으로 적어줘야 한다. public Todo() {} JPA 구현체는 리플렉션(런타임 시점에 클래스의 정보를 조회하거나 수정할 수 있게 해주는 기능)을 사용하여 엔티티를 관리하게 된다, 이 과정에서 파라미터가 없는 기본 생성자를 호출하게 되는데, 만약 사용자 정의 생성자만 있고 기본 생성자가 없다면 JPA 구현체는 해당 엔티티의 인스턴스를 생성할 수 없게 된다. 2-..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/brVgoS/btsBUalQJ3a/lrf8kWMhXUJlbt5Dy7IhIk/img.png)
MySQL Shell을 사용해봤는데 직관적이지 않은 것 같아 Workbench를 사용해보려 설치하다가 두 가지 오류를 겪었다. 1. 버전 호환 문제 workbench를 설치하면서 server를 설치하고 mysql로 연결하는 과정에서 아래 오류가 발생했다. Connection warning (local instance mysql) incompatible/nonstandard server version or connection protocol detected (8.2.0) connection to this database can be established but some Mysql workbench features may not work properly since the database is not full..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bE7HYx/btsBQhsdKKR/Ma6KRLPjfcGyaDn2EW9bv0/img.png)
스프링 부트에서 MySQL 도커로 실행했을 때의 환경으로 정리 의존성 설치 // Spring Boot 3.1 이상 com.mysql mysql-connector-j // Spring Boot 3.0 이하 mysql mysql-connector-java 설정 // application.properties spring.datasource.url=jdbc:mysql://localhost:3306/todos// 데이터 베이스 이름 spring.datasource.username=todos-user spring.datasource.password=dummytodos spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect// mysql..
람다 함수 bean이름 -> 조건식 예시) public void deleteById(int id) { Predicate
JSP 내 태그 활용도를 높이기 위해 사용되는 라이브러리. 서버 사이드 로직을 구현하는 데 사용되는 특수한 태그들을 제공한다. 설치 https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/c/tld-summary.html JSTL core (TLDDoc Generated Documentation) import Retrieves an absolute or relative URL and exposes its contents to either the page, a String in 'var', or a Reader in 'varReader'. docs.oracle.com 버전 지정해줘야 함 jakarta.servlet.jsp.jstl jakarta.servlet.js..
StringBuffer 문자열을 그대로 return하면 효율이 안 좋기 때문에 StringBuffer 사용 @RequestMapping("say-hello-html") @ResponseBody public String sayHelloHtml() { StringBuffer sb = new StringBuffer(); sb.append(""); sb.append(""); sb.append(""); sb.append("StringBuffer 테스트"); sb.append(""); sb.append(""); return sb.toString(); } JSP StringBuffer를 이용해 HTML을 그리는 것 보다 더 효율적으로 코드를 작성할 수 있음 방식 jsp파일에 html을 그린 뒤 거기로 리디렉션 시킴 ..
-스테레오 어노테이션- @Component 대신 사용해 코드 명확성을 강화할 수 있음 @Service 클래스에 비즈니스 로직이 있음 @Controller 웹 컨트롤러일 경우 @Repository Bean이 데이터베이스와 통신해 데이터를 저장하거나 검색하거나 조작하는 경우 사용 @RestController REST API 컨트롤러일 경우 -기타 어노테이션- @Primary 중복된 Bean에 우선권 @Qualifier Primary보다도 우선권. 조건문처럼 사용하는 듯 @Lazy 사용될 때여야 초기화됨. 레이지 로딩같은 거 @Scope(~~프로토타입) Bean을 요청할 때마다 새로운 인스턴스 생성 @PostConstruct useEffect 역할 @PreDestroy useEffect의 클린업 역할 @Nam..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/k1rqB/btsBhYsluck/JGje8ZLDNHfBqnHjz0aA21/img.png)
H2 인메모리 데이터베이스 1. H2 콘솔 사용 설정 // application.properties spring.h2.console.enabled=true// H2 콘솔 사용 활성화 spring.datasource.url=jdbc:h2:mem:testdb// 고정된 url 생성 이후 http://localhost:8080/h2-console 접속 가능 JDBC URL에 콘솔에 있는 url을 입력한 뒤 연결 2-1. H2 테이블 생성 Spring Data JPA Starter를 활용할 때마다 가져올 schema.sql 만들기 sql에서는 큰 따옴표(")대신 작은 따옴표(')를 써야함 // src/main/resources/schema.sql create table course ( id bigint not ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TmXJK/btsBfy2kTCI/rlgsuPeqSJ3yCnKjKXqpQ0/img.png)
사용되는 의존성 Spring Web Spring MVC를 이용해 RESTful을 비롯한 웹 애플리케이션 구축 기본 임베디드 컨테이너로서 apach tomcat을 사용 Spring Boot DevTools 빠른 애플리케이션 시작을 위해 구성을 제공 (변경 사항 재시작 필요없이 자동 적용 등) Spring vs Spring Boot Spring이 가지는 문제 의존성 관리 번거로움 web.xml 설정 필요 스프링 환경의 여러 설정을 적절히 지정해줘야 함 로깅, 에러 핸들링, 모니터링 등 비기능적인 부분들을 수동으로 구현해야 함 프로젝트마다 이 작업들을 해줘야 해서 개발 시간이 오래 걸림 Spirng Boot를 사용하면 위 문제들을 신경쓸 필요 없이 비즈니스 로직에만 집중할 수 있음 즉, 프로덕션 환경에 배포할..
지연 초기화 일반적으로는 context가 실행되면 즉시 Spring Bean이 초기화됨 @Component class ClassB { private ClassA classA; public ClassB(ClassA classA) { System.out.println("초기화"); this.classA = classA; } public void doSomthig() { System.out.println("doSomthig"); } } @Configuration @ComponentScan public class LazyInitializationLauncherApplication { public static void main(String[] args) { try(var context = new Annotatio..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bINLZu/btsA7vJ9IQg/WdsMZp0XbMy1LTFg4rKkzk/img.png)
개념 Spring은 의존성 주입을 활용하여 객체의 생성과 의존성 관리를 자동화함으로써, 개발자가 객체 간의 결합도를 낮추고 유지 보수가 용이한 코드를 작성할 수 있게 해줌 1. Spring Container(= Spring context, Spring IOC Container) 스프링 Bean과 생명 주기를 관리 1-1) Bean Factory 기본 Spring Container 1-2) Application Context 엔터프라이즈 전용 기능을 제공하는 Spring Container 웹 애플리케이션을 구축하기 쉬움 국제화가 쉬움 Spring AOP, 스프링 측면 지향 프로그래밍과 통합하기 쉬움 2. Java Bean과 Spring Bean 각각 Java와 Spring에서 관리하는 객체 2-1) POJ..
Java 자료형 기본형 타입(Primitive Type) 참조형 타입(Reference Type) - 논리형 - boolean - 정수형 - byte short int long - 실수형 - float double - 문자형 - char array enumeration class interface 기본형 타입 byte - 주로 파일이나 네트워크 데이터 처리 short - 낮은 메모리를 요구하는 애플리케이션, 예를 들어 임베디드 시스템에서 사용 int (기본) - 가장 일반적으로 사용되는 정수 타입 long - 매우 큰 정수 값을 저장하는 데 사용 float - 더 작은 범위의 실수와 적절한 정밀도를 제공하며, 메모리 사용이 더 적음. 정밀도가 그렇게 중요하지 않은 경우에 적합 double (기본) - f..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dA3tNx/btsAUmgAveI/T5wOZEevRc1oUSvcWcnnmK/img.png)
하이퍼 기반의 가상화 vs 컨테이너 기반 가상화 하이퍼 기반의 가상화 또 하나의 가상 서버를 실행하는 기술 호스트 = 물리서버 게스트 = 가상서버 하이퍼바이저 = 서버 가상화 기술로서 호스트 서버에 설치되고 호스트와 게스트를 나누는 역할을 수행 각각의 게스트는 하이퍼바이저에 의해 관리되며 시스템 자원을 할당받게 됨 게스트os에서 실행되는 애플리케이션이 호스트 자원을 사용하기 위해서는 반드시 게스트 os를 거쳐야하기에 속도가 느릴 수 있음 컨테이너 기반 가상화 격리된 환경에서 프로세스를 실행하는 기술 애플리케이션은 도커 엔진을 통해 자원을 사용할 수 있고, 구조적으로 게스트os가 없기 때문에 가벼움 도커 도커 허브 도커에서 제공하는 이미지 저장소 도커 이미지 응용 프로그램을 실행하는 데 필요한 모든 것이 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ySzqB/btsAVqQzyYL/niGQkToY9JXVmOLVNYKCg1/img.png)
dependencies 설치 build.gradle에 dependencies를 설정해줌 (package.json같은 것인듯?) dependencies확인은 아래에서 확인 가능 https://mvnrepository.com/ implementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '10.1.16' // 위 코드에서 group, name, version 등 불필요한 부분을 삭제할 수 있음 (Gradle(Short)으로 해도 됨) implementation 'org.apache.tomcat.embed:tomcat-embed-core:10.1.16' 기본 세팅 예시) // tomcat implementation 'o..
그래프 관계에서 합집합을 찾을 때 유용 parent = [i for i in range(5)] # 부모테이블 초기화 (자기 자신을 부모로 갖도록) # 재귀적으로 파고들어 같은 것을 가리키도록 설정함 def find(x): # parent는 0부터 시작함(parent[0]은 0임) if x == parent[x]: return x else: p = find(parent[x]) parent[x] = p return parent[x] # x와 y가 같은 값을 가리키도록 하여 집합을 묶음 def union(x, y): x = find(x) y = find(y) if x != y: # 더 작은 원소를 부모로 삼도록 설정(=오른쪽 원소의 부모값을 왼쪽 원소로 설정) parent[y] = x union(1, 4) #..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/clbBKt/btsAeCKud79/5E4kydtKL40Oci1efUCDSk/img.png)
요소를 낱개로 다 쪼갠 뒤 쪼갠 것을 비교해가며 합치는 방식 합칠 때는 다음 과정을 따른다. 1. 2덩어리씩 합침. 이때 정렬해서 합침 2. 2덩어리(a, b) 와 하나로 합쳐질 덩어리(c) 3개에서 각각 index 역할을 해줄 변수들을 3개 만듦 3. index를 활용해 a, b를 비교하고 작은 것을 c에 추가하며 index들을 1씩 증가시키는 것을 반복 4. a, b 한 쪽을 다 채워넣었다면 나머지 한 쪽은 그냥 순차적으로 채워넣으면 됨(a, b모두 이미 반복되는 과정에서 정렬이 보장된 것들임) def merge_sort(array): # 1개가 될 때까지 재귀적으로 쪼갬 if len(array) i and len(right) > j: if left[i] > right[j]: array[k] = le..
덱(deque)from collections import deque 양쪽 끝에서 아이템을 추가하거나 삭제할 수 있는 양방향 큐append(x): 오른쪽 끝에 아이템 x를 추가합니다.appendleft(x): 왼쪽 끝에 아이템 x를 추가합니다.pop(): 오른쪽 끝의 아이템을 제거하고 반환합니다.popleft(): 왼쪽 끝의 아이템을 제거하고 반환합니다.extend(iterable): 오른쪽 끝에 주어진 iterable의 모든 아이템을 추가합니다.extendleft(iterable): 왼쪽 끝에 주어진 iterable의 모든 아이템을 역순으로 추가합니다.힙큐(heapq)import heapq heapq는 일반적인 리스트를 최소 힙, 최대 힙처럼 사용할 수 있게 해줌우선순위 큐와 최소값, 최대값을 구할 때 ..