전체 글 (86) 썸네일형 리스트형 해시 테이블 원리 및 구현 (With Python) 1. 정의 키를 값에 매핑할 수 있는 구조인 연관 배열 추상 자료형을 구현한 자료구조이다. 가장 큰 특징은 시간 복잡도가 O(1)이라는 점이다. 덕분에 데이터 양에 관계없이 빠른 성능을 기대할 수 있다. 해시 테이블의 핵심은 해시 함수이다. 해시 함수는 임의 크기 데이터를 고정 크기 값으로 매핑하는 데 사용할 수 있다. 해시 테이블을 인덱싱하기 위해 해시 함수를 사용하는 것을 해싱이라 한다. 성능 좋은 해시 함수들의 특징은 아래와 같다. 해시 함수 값 충돌 최소화 쉽고 빠른 연산 해시 테이블 전체에 해시 값이 균일하게 분포 사용할 키의 모든 정보를 이용해 해싱 해시 테이블 사용 효율이 높을 것 2. 충돌 해시 테이블에 충돌은 얼마나 많이 발생할까? 생각보다 쉽게 일어난다. 예시로 생일 문제를 들 수 있다.. Optional 개념과 활용 1. 정의 public final class Optional { private final T value; } T타입 객체의 래퍼 클래스. T타입의 참조변수를 갖고 있다. T value의 의미는 모든 종류의 객체 저장 가능하다. 참고로 래퍼 클래스는 기본 타입에 해당되는 데이터를 객체로 포장해주는 클래스이다. ex) Integer, Long. Optional을 왜 사용하냐면 null을 직접 다루는 것은 위험하기에(NullPointerException 문제) 객체에 담아서 간접적으로 null을 다룰 수 있다. 기존에 null 체크를 하면 코드가 지저분했기에 Optional을 자주 사용하는 편이다. 2. 활용 예시 1) Optional 객체 생성하기 String str= "hello"; Optional opt.. AWS S3 + Vue.js + SpringBoot(3/3) - CDN, Lambda 적용하기 1. 이미지 로딩 속도 개선 원본 사이즈를 그대로 올리는 건 엄청 오래 걸립니다. 보통 하나의 이미지 사이즈가 5MB라고 가정했을 때, 100개의 사진 목록을 한꺼번에 불러오려면 무려 500MB를 로딩해야 합니다. 이러면 로딩이 늦을 수밖에 없겠죠? 그래서 빠른 이미지 로딩을 위해서는 이미지 사이즈를 줄이는 게 필수입니다. 이미지 사이즈를 줄이는 데 2가지 방법이 있습니다. 첫 번째는 서버에서 직접 이미지 크기를 조정하는 것입니다. 두 번째는 SERVERLESS 한 LAMBDA를 활용하는 것입니다. 서버에서 많은 이미지를 리사이징 하면, CPU 리소스가 상당히 되기에 서버에 상당한 부하를 줄 수 있습니다. 이 포스팅에서는 LAMBDA의 방법을 설명하겠습니다. 또한 CDN도 사용하면 이미지 로딩 속도가 빨.. AWS S3 + Vue.js + SpringBoot(2/3) - S3와 프론트, 서버 연동 ※ 참고로 이 포스팅은 기본적인 axios와 api 연동에 관한 설명을 다루지 않습니다. 일반 데이터와 이미지 파일들이 뭐가 다른지 중점적으로 설명합니다. 기본적인 Vue.js와 spring boot 연동에 관해서는 다른 글들을 참고하시길 바랍니다. 1. 전체적인 플로우 Vue.js에서 MultipartFile 형식의 이미지를 서버에 전송 서버는 이미지 파일 확장자 확인 파일 이름을 토대로 중복이 안 되게끔 UUID로 지정 S3 bucket에 파일 업로드 DB에 키 값 저장 그냥 설명만 하면 재미가 없기에 제가 만든 프로젝트를 이용해 설명하겠습니다. 강남병원의 섬네일과 전체적인 사진들을 올려보겠습니다. 등록된 사진이 아무것도 없습니다. 썸네일 이미지 파일을 받아오는 JSON 형태는 아래처럼 가정하겠습니다.. 스트림(Stream) - 최종 연산(3/3) 1. 최종 연산 Terminal Operation. 연산결과가 스트림이 아닌 연산, 단 한 번만 적용가능하다. 스트림의 요소를 소모한다. forEach(): 지정된 작업 수행. forEachOrdered(): 순서 유지. 병렬 스트림으로 처리할 때 작업 순서를 유지할 때 사용. forEach와 마찬가지로 지정된 작업을 수행한다. count(): 요소의 개수 반환. max(), min(): 최대값/최소값 반환. findAny(): 아무거나 하나 스트림의 요소를 반환. findFirst(): 첫번째 요소를 반환. allMatch(): 주어진 조건을 모두 만족하는지. anyMatch(): 주어진 조건들을 하나라도 만족하는지. noneMatch(): 모두 만족하는지 않는지. toArray(): 스트림의 모든 요.. AWS S3 + Vue.js + SpringBoot(1/3) - S3 사용 이유와 버킷 생성 1. S3를 왜 사용할까? 나중에 서비스가 커질 때, 서버를 확장해야 할 때가 있습니다. 이럴 때는 아래의 방식처럼 서버를 확장해야 합니다. Load Balancer는 요청이 들어오면 서버의 부하가 없는 곳에 전해줍니다. 이럴 경우 아래의 사건들이 발생합니다. DB: 서버와 완전 무관합니다. 처리하고 호출만 해줘서, 중앙화된 서버가 있어서 똑같은 데이터를 바라보기에 상관이 없습니다. 이미지: 아미지 파일들이 흩어져서 저장됩니다. 즉, 서버들이 상태를 갖게 됩니다. Stateful 한 상태가 되면 아래의 세 가지 문제가 발생합니다. 이미지 관리: 예를 들어 img6이 loadBalancer를 통해 Server3에서 저장이 됐는데 Server1에서 삭제하려고 하면 삭제를 못 합니다. 서버 축소: 항상 서버가.. 스트림(Stream) - 중간 연산(2/3) 여기서부터 진짜 중요한 내용입니다. 실무에서 자주 사용되는 문법이니 꼭 인지하시는 걸 추천드립니다. 1. 스트림의 연산 중간 연산과 최종 연산이 있습니다. 중간 연산: 연산결과가 스트림인 연산. 반복적으로 적용 가능합니다. 최종 연산: 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능합니다. Stream.distinct().limit(5).sorted().forEach(System.out::println) 주황색은 중간 연산을 표시하고 3개를 표현했습니다. (N개 가능) 빨간색은 최종 연산이며 1개만 올 수 있습니다. 2. 중간 연산 distinct(): 중복을 제거한다. filter(Predicate predciate): 조건에 안 맞는 요소를 제거 limit(long maxsize): 일부를 잘라낸.. 스트림(Stream) - 개념(1/3) 1. 개념 스트림은 데이터의 연속적인 흐름. 다양한 데이터(컬렉션 배열 등)를 표준화된 방법으로 다룰 수 있다. List list = Arrays.asList(5,12,13,57); 위의 코드는 Integer 요소가 있는 list를 표현한 것이다. 형태가 list로 고정됐다. Stream intStream = list.stream(); // 컬렉션 Stream strStream = stream.of(new String[]{"apple","cd","melon"}); //배열 Stream intStream = stream.iterate(0,n->n+3); //0,3,6,9 Stream intStream = stream.generate(Math::random); //람다식 반면 스트림은 어떤 형태든 변화할 수.. 이전 1 2 3 4 5 6 7 8 ··· 11 다음