목록전체 글 (293)
가수면
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..
스프링 부트에서 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..
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 ..
사용되는 의존성 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..
개념 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..
하이퍼 기반의 가상화 vs 컨테이너 기반 가상화 하이퍼 기반의 가상화 또 하나의 가상 서버를 실행하는 기술 호스트 = 물리서버 게스트 = 가상서버 하이퍼바이저 = 서버 가상화 기술로서 호스트 서버에 설치되고 호스트와 게스트를 나누는 역할을 수행 각각의 게스트는 하이퍼바이저에 의해 관리되며 시스템 자원을 할당받게 됨 게스트os에서 실행되는 애플리케이션이 호스트 자원을 사용하기 위해서는 반드시 게스트 os를 거쳐야하기에 속도가 느릴 수 있음 컨테이너 기반 가상화 격리된 환경에서 프로세스를 실행하는 기술 애플리케이션은 도커 엔진을 통해 자원을 사용할 수 있고, 구조적으로 게스트os가 없기 때문에 가벼움 도커 도커 허브 도커에서 제공하는 이미지 저장소 도커 이미지 응용 프로그램을 실행하는 데 필요한 모든 것이 ..
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) #..
요소를 낱개로 다 쪼갠 뒤 쪼갠 것을 비교해가며 합치는 방식 합칠 때는 다음 과정을 따른다. 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는 일반적인 리스트를 최소 힙, 최대 힙처럼 사용할 수 있게 해줌우선순위 큐와 최소값, 최대값을 구할 때 ..
https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#callbacks-on-usequery-and-queryobserver-have-been-removed Migrating to TanStack Query v5 | TanStack Query Docs useQuery and friends used to have many overloads in TypeScript - different ways how the function can be invoked. Not only this was tough to maintain, type wise, it also required a runtime check to see which type the fir..
그래프 내 특정 노드와 그래프 내 존재하는 모든 노드들 간의 각각 최단 거리를 구하는 알고리즘 원리 1. 초기값 세팅. (기준 노드를 0으로 놓고 나머지 노드들까지의 거리를 inf로 설정) 2. 그래프를 순회하며 순회한 노드들을 우선 순위 큐에 거리가 짧은 순으로 쌓음 3. 하나씩 dequeue하면서 해당 노드까지의 거리로 inf를 수정함 4. dequeue한 노드와 연결된 노드들을 우선 순위 큐에 다시 거리가 짧은 순으로 추가 5. 3번의 과정을 반복하면서 중복된 노드들이 있다면 거리값을 더 작은 값으로 수정 (ex. A->b까지 5인데 A->C->B거리가 3이라면 B의 값은 3으로 교체) 6. 우선 순위 큐를 사용하면 우선 순위가 떨어지는(거리가 먼) 노드들의 계산은 뒤로 갈수록 스킵되기에 빠른 계산..
모든 경우의 수를 놓고 최적의 경우를 고른다기보다는 각 단계에서 최적의 경우를 고르는 전략임 그렇기 때문에 최적의 경우가 아닌 결과가 도출될 수 있음 (탐욕이라는 말이 정말 적절하다...) 문제1: 동전 문제 지불해야 하는 값이 4720원 일 때 1원 50원 100원, 500원 동전으로 동전의 수가 가장 적게 지불하시오. coin_list = [500, 100, 50, 1] def min_coin_count(value, coin_list): total_coin_count = 0 details = list() coin_list.sort(reverse=True) for coin in coin_list: coin_num = value // coin total_coin_count += coin_num value..
이진 탐색 def binarySearch(data, searchValue): if len(data) == 1 and searchValue == data[0]: return True if len(data) == 1 and searchValue != data[0]: return False if len(data) == 0: return False medium = len(data) // 2 if searchValue == data[medium]: return True else: if searchValue > data[medium]: return binarySearch(data[medium + 1:], searchValue) else: # 리스트 슬라이싱에서 [:medium]는 medium을 포함하지 않음 ret..