hyundho12의 등록된 링크

키자드에 등록된 총 120개의 포스트를 확인하실 수 있습니다.

Naver Blog

Spring Rest Docs 적용

build.gradle 설정 plugins { id "org.asciidoctor.jvm.convert" version "3.3.2" ## 1 } configurations { ##2 asciidoctorExt } dependencies { ##3 asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor:{project-version}' ##4 testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc:{project-version}' } ext { ## 5 snippetsDir = file('build/generated-snippets') } test { ##6 outputs.dir snippetsDir } asciidoctor { ## 7 inputs.dir snippetsDir ##8 configurations 'asciidoctorE

Naver Blog

Git git reset --hard 되돌리기, reflog

git commit을 하다가 이전 commit으로 돌아가려고 할떄, 주로 git reset --hard HEAD~를 사용한다. 이때 --hard는 다른 옵션들과 달리 파일 내용을 완전히 삭제시킨다. git reset이전으로 되돌리고 싶을경우 git reflog로 commit log을 확인하여 git reset이전으로 되돌린다. git reset <option> git reset에 줄수 있는 옵션은 3가지가 있음. --hard 가장 강력한 리셋 옵션이다. 영향범위 - 커밋, 스테이징영역, 작업 디렉토리 모두 리셋된다. - 로컬에서 변경사항을 모두 삭제하고, 특정 커밋 상태로 되돌리려는 경우 git reset --hard HEAD~1 --mixed 커밋과 스테이징 영역을 리셋하지만 작업 디렉토리는 유지한다. 영향범위 - 커밋과 스테이징 영역이 리셋된다. - 작업 디렉토리는 수정된 상태를 유지하며, git status로 변경 사항을 확인할 수 있다. git reset --mixed HEA

Naver Blog

Spring Security + JWT 로그인 구현

1.라이브러리 설정 dependencies { ... // Spring Security implementation 'org.springframework.boot:spring-boot-starter-security' // JWT implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' } 2.JwtToken DTO 생성 @Builder @Data @AllArgsConstructor public class JwtToken { private String grantType; private String accessToken; private String refreshToken; } grantType는 JWT에 대한 인증타입이다. 보통 Bearer 인증방식을 사용한다. Access T

Naver Blog

@Bean, @Configuration, @Component 차이점

Spring MVC는 기본적으로 xml을 사용해서 bean을 등록했다. 하지만 프로젝트의 규모가 커지면서 사용하는 요소들을 xml에 등록하는것이 불편할때 애노테이션을 활용하여 Bean을 등록하는 방법이 생겨났다. Spring Bean Spring에서 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심용소이다. Spring에서는 이러한 Bean을 싱글톤 객체로 생성하여 관리한다. @Bean @Configuration 수동으로 Spring Container에 Bean을 등록하는 방법 개발자가 직접 제어가 불가능한 라이브러리를 Bean으로 등록할때 불가피하게 사용 1개이상의 @Bean을 제공하는 클래스의 경우 @Configuration을 명시해주어야 싱글톤이 보장됨 @Component 자동으로 Spring Container에 Bean을 등록하는방법 Spring의 C

Naver Blog

[Spring]class java.lang.String cannot be cast to class org.springframework.security.core.userdetails

Spring Security + JWT 적용중 : Principal Class: org.springframework.security.core.userdetails.User 이러한 오류발생 문제의 원인분석 현재 SecurityContextHolder.getContext().getAuthentication().getPrinipal()의 타입이 CustomUserDetails가 아니라 org.springframework.security.core.userdetails.User로 반환되고 있다. 수정전 public Authentication getAuthentication(String accessToken) { Claims claims = parseClaims(accessToken); if (claims.get("auth") == null) { throw new RuntimeException("권한 정보가 없는 토큰입니다."); } Collection<? extends GrantedAutho

Naver Blog

Docker 설치하기(라즈베리파이 기준, Ubuntu 22.04 LTS, ARM64

1.기존 Docker 관련 패키지 제거(잘못 설치한 경우) sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get autoremove 2. 필수 패키지 설치 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg ca-certificates: HTTPS 기반 패키지 다운로드를 위한 인증서 curl: 파일 다운로드 도구 gnupg: GPG 키 관리를 위한 패키지 3. Docker 공식 GPG 키 추가 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.gpg > /dev/null sudo chmod a+r /etc/apt/keyrings/docker.gpg GP

Naver Blog

인덱스(복합인덱스,커버링인덱스, KeySet)

인덱스란? 인덱스란 추가적인 쓰기작업과 저장공간을 활용하여 데이터베이스 테이블의 검색속도를 향상시키기위한 자료구조이다. 복합 인덱스 여러 컬럼을 기준으로 만든 인덱스 커버링 인덱스 커버링 인덱스는 그 복합 인덱스에 포함된 컬럼들만으로 조회가 가능한 경우, 테이블 접근 없이 인덱스만으로 조회할 수 있는 것. CREATE TABLE post ( id BIGINT, title VARCHAR(255), author VARCHAR(255), views INT ); 쿼리1 SELECT title, author FROM post WHERE title = 'Hello'; 이 쿼리는 title 조건을 사용하고 SELECT 대상도 title, author → 인덱스 안에 모두 있음 커버링 인덱스 됨! 쿼리 2 SELECT title, views FROM post WHERE title = 'Hello'; views는 인덱스에 없음 커버링 인덱스가 아님 → 테이블 접근 필요 인덱스사용법 CREATE

Naver Blog

[Querydsl] Projection

프로젝션(Projection) 프로젝션은 select절에서 사용되며 쿼리 결과를 원하는 개체나 값으로 변환해주는 기능을 제공한다. ("select 결과를 바로 DTO에 넣고싶다" Entity 전체를 가져오는게 아니라, 필요한 컬럼만 뽑아서 넣고싶다.) 종류 설명 특징 Projections.fields() DTO의 필드명에 매칭해서 값을 넣음 필드명 정확히 맞아야 함 Projections.constructor() DTO의 생성자 파리미터 순서에 맞춰 값을 넣음 타입, 순서 정확히 맞아야함 Projections.bean() Setter 메서드로 값을 주입함 setter 메서드가 필요 1. Projections.fields() .select(Projections.fields(PostDto.class, post.id, post.title, post.content )) 필드명이 DTO의 변수명과 정확히 같아야 한다. DTO에 기본 생성자가 있어야 한다. 2. Projections.constr

Naver Blog

좋아요서비스, 동시성문제 해결

좋아요 기능에서 왜 동시성 문제가 발생할까? 사용자가 동시에 같은 게시글에 좋아요를 누를 경우, likeCount(좋아요 수)를 올리는 update 쿼리가 동시에 실행됩니다. 이 때, 정합성 제어가 없다면 likeCount가 실제 누른 횟수보다 적게 올라가는 현상이 발생할 수 있습니다. → Race Condition ※ 기본 좋아요 기능 코드 @Transactional public void likePost(Long userId, Long postId){ if(likeRepository.existsByUserIdAndPostId(userId, postId)){ throw new IllegalArgumentException("이미 좋아요를 누른 게시글입니다."); } User user = userRepository.findById(userId).orElseThrow(); Post post = postRepository.findById(postId).orElseThrow(); Like l

Naver Blog

카프카(Kafka)

Apache Kafka LinkedIn에서 최초로 만들고 opensource화 한 확장성이 뛰어난 분산 메시지 큐(FIFO : First In First Out) "대용량 데이터를 빠르고 안정적으로 송수신하고 처리하기 위한 메시지 큐 시스템" 카프카 아키텍처 카프카 아키텍처 Broker : Kafka를 구성하는 각 서버 1대 = 1 broker Topic : data가 저장되는 곳, 메시지를 구분하는 논리적인 채널 Producer : 데이터를 보내는 쪽, broker에 데이터를 write Consumer : 데이터를 읽는 쪽, broker에 데이터를 read Consumer-Group : 메시지 소비자 묶음 단위 Zookeeper : Kafka를 운용하기위한 Coordination Service, Kafka 클러스터가 잘 동작하도록 중앙에서 관리해주는 비서 같은 역할 (Kafka 2.x까지는 Zookeeper가 필수였고, 3.x부터는 선택) Partition : Topic을 나누는

Naver Blog

Kafka Producer acks

Kafka Producer의 acks와 동작 원리 ※ acks란? 메시지를 보낸 후, Kafka Broker가 응답할 조건을 설정하는 파라미터 props.put("acks", "all"); // 또는 "0", "1" 2. acks에 따른 메시지 전송 흐름 acks = 0 Producer는 메시지를 보내고 바로 끝냄 Kafka는 수신 여부를 응답하지 않음 성능은 최고, 하지만 메시지 유실 가능성 높음 Producer → (no response) → Done acks = 1 (기본값) 메시지가 해당 Partition의 Leader Broker에 도달하면 OK 응답 Follower에 도달하지 않아도 성공으로 간주 Producer → Leader Broker [OK] → Done (Follower는 나중에 복제) 리더가 저장한 직후 다운되면, 팔로워가 복제 전에 유실될 수 있음 acks = all (or -1) 메시지가 ISR(In-Sync Replica) 목록의 모든 Broker에

Naver Blog

9장 웹 크롤러 설계

크롤러란, 웹 페이지의 컨텐츠를 찾아 자동으로 검새가고 스캔하는 프로그램을 말한다. 검색 엔진 인덱싱: 크롤러의 가장 보편적인 예시로서, 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스를 만든다. 구글봇은 구글 검색엔진이 사용하는 웹 크롤러이다. 웹 아카이빙: 나중에 사용할 목적으로 장기보관하기 위해 웹에서 정보를 모으는 절차를 말한다. 웹 마이닝: 크롤러를 사용해 정보를 모으고 해당 정보를 통해 데이터 마이닝을 하는 것을 의미한다. 웹 모니터링: 웹 크롤러를 통해 저작권이나 상표권이 침해된 사례를 찾아낸다. 1단계 문제 이해 및 설계 범위 확정 1. URL 집합이 주어지면, 해당 URL들이 가리키는 웹 페이지를 다운로드 한다. 2. 다운로드 웹 페이지에서 URL들을 추출한다. 3. 추출된 URL들을 다운로드 할 URL 목록에 추가하고 위의 과정을 처음부터 다시 반복한다. 웹 크롤러는 위 처럼 단순하게 작동하지 않기 때문에 상세한 내용을 살펴봐야 한다. 중요 속성은 다음과 같다. 규

Naver Blog

C# ref,out 키워드

ref, out 키워드 ref와 out 키워드는 인자로 넘긴 변수를 메서드 내부에서 참조 형태로 사용 한다는 점에서 동일하다. 속성(Property)은 변수가 아니므로 전달할 수 없다. using System; namespace Test { class Program { static void Main(string[] args) { int i = 0; modifyValue(ref i); Console.WriteLine(i); int j; modifyValueTwo(out j); Console.WriteLine(j); } static void modifyValue(ref int a) { a = 5; } static void modifyValueTwo(out int a) { a = 20; } } } // 5 // 20 두 키워드의 차이점 ref는 인자로 전달하기 전에 반드시 변수를 초기화를 해야 하지만, out은 초기화를 하지 않아도 된다. out은 메서드가 반환되기 전에 반드시 값을 할당

Naver Blog

10장 알림 시스템 설계

Q) 어떤 종류의 알림? A) 푸시알림, SMS 메시지, 이메일 iOS,Android,LapTop/DeskTop 지원해야함 Q) 실시간 시스템인지? A) 연성 실시간 시스템(Soft real-time) 가능한 빨리 전달되어야 하지만, 요청이 몰린 경우 약간의 딜레이 허용 Q) 사용자가 알림을 받지 않는 옵션이 존재하는지? A) 사용자가 알림을 허용하지 않으면 알림을 받지 않음 Q) 하루에 몇 건의 알림? A) 천만 건의 모바일 푸시, 백만 건의 SMS 메시지, 5백만 건의 이메일 2단계 개략적 설계안 제시 및 동의 구하기 iOS 푸시 알림 알림 제공자 -> APNS --> iOS 단말기 알림 제공자 - 알림 요청을 만들어 APNS로 보내는 주체 - 단말토큰, 페이로드 데이터 필요 APNS : 애플이 제공하는 원격 서비스, 푸시 알림을 iOS 단말로 보냄 안드로이드 알림 제공자 --> FCM(Firebase Cloud Messaging) --> 안드로이드 단말 SMS 메시지 알림제공자

Naver Blog

11장 뉴스 피드 시스템 설계

뉴스피드(news feed)란? 뉴스 피드는 여러분의 홈 페이지 중앙에 지속적으로 업데이트되는 스토리들로, 사용자 상태 업보 업데이트, 사진, 비디오, 링크, 앱 활동(app activity), 그리고 여러분이 페이스북에서 팔로워하는 사람들, 페이지, 또는 그룹으로부터 나오는 '좋아요' 등을 포함한다. 1단계 문제 이해 및 설계 범위 확정 질문예시 - 모바일 앱을 위한 시스템인가요? 아니면 웹? 둘다 지원해야 합니까? - 중요한 기능으로는 어떤 것이 있을까요? - 뉴스피드에는 어떤 순서로 스토리가 표시되어야 하나요? 최신순 인가요? 아니면 토픽 점수(topic score) 같은 다른 기준이 있습니까? - 한 명의 사용자는 최대 몇 명의 친구를 가질 수 있습니까? - 트래픽 규모는 어느 정도 입니까? - 피드에 이미지나 비디오 스토리도 올라올 수 있습니까? 2단계 개략적 설계안 제시 및 동의 구하기 (1) 피드발행(feed publishing)과 (2) 뉴스 피드 생성(news fee

Naver Blog

C# Generic (제네릭)

Generalization 제네릭 (일반화) 호랑이, 사슴, 개 >> 동물 특수한 개념에서 공통된 개념을 찾아 묶는 것 public void Copy(int[] source, int[] target) { for(int i=0; i<source.length; i++) { target[i] = source[i]; } } public void Copy(float[] source, float[] target) { for(int i=0; i<source.length; i++) { target[i] = source[i]; } } public void Copy(string[] source, string[] target) { for(int i=0; i<source.length; i++) { target[i] = source[i]; } } 위와 같이 복사하는 Copy 메서드가 자료형에 따라 생성되어있다. 하지만 이런 경우 관리하기가 힘들다. public void Copy(object[] source

Naver Blog

C# 형변환 (as is)

as : 형변환 할수 있는지 확인 후 할수 있으면 형변환 / 할수 없으면 null void start() { Person person = new Person(); Monster monster = new Monster(); //person = (person)monster; person = monster as Person; } is : 형변환 할수 있는지 확인후 true/false bool 값으로 반환 void start() { Person person = new Person(); Monster monster = new Monster(); if(monster is Person) { person = (Person)monster; } }

Naver Blog

자바 개발자가 피해야하는 11가지 실수

1. Nulls와 Optionals Bad Practice: 메서드에서 바로 null을 리턴하는 것은 NPE를 유발할수있다. public String getString() { return null; } Good Practice: null에 대한 명확한 핸들링과 에러방지를 위해 Optional을 사용한다. public Optional<String> getString() { return Optional.empty(); } 2. String.valueOf()로 String 변환 Bad Practice: + 연산자를 사용해 문자열을 합칩니다. double d = 3.14525; String s = "" + d; Good Practice: 내장 메서드를 활용한다. double d = 3.14525; String s = String.valueOf(d); 3. array를 복사할 때 Arrays.copyOf() Bad Practice: 정상적으로 array를 복사합니다. int[] sourceA

Naver Blog

[2024 마이 블로그 리포트] 데이터로 찾아보는 내 블로그 마을

. 2024 마이 블로그 리포트 블로그 마을로 초대합니다: 지금 내 블로그 마을을 확인해 보세요! event.blog.naver.com

Naver Blog

약수의 개수와 덧셈

https://school.programmers.co.kr/learn/courses/30/lessons/77884 코딩테스트 연습 - 약수의 개수와 덧셈 두 정수 left 와 right 가 매개변수로 주어집니다. left 부터 right 까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 1 ≤ left ≤ right ≤ 1,000 입출력 예 left right result 13 17 43 24 27 52 입출력 예 설명 입출력 예 #1 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다. 수 약수 약수의 개수 13 1, 13 2 14 1, 2, 7, 14 ... school.programmers.co.kr 문제) left,right 두 매개변수가 주어지면, left부터 right까지 모든 수 중에서 약수의 개수가 짝수인것은 더하고, 약수의 개수가 홀수인 것

Naver Blog

가장 많이 받은 선물

https://school.programmers.co.kr/learn/courses/30/lessons/258712 코딩테스트 연습 - 가장 많이 받은 선물 선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다. 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다. 예를 들어 A 가 B 에게 선물을 5번 줬고, B 가 A 에게 선물을 3번 줬다면 다음 달엔 A 가 B 에게 선물을 하나 받습니다. 두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 ... school.programmers.co.kr import java.util.*; class Solution { public int solution(String[] friends, String[]

Naver Blog

모음사전

https://school.programmers.co.kr/learn/courses/30/lessons/84512 코딩테스트 연습 - 모음사전 사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다. 단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요. 제한사항 word의 길이는 1 이상 5 이하입니다. word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다. 입출력 예 word... school.programmers.co.kr 문제 사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째

Naver Blog

Junit & AssertJ & Mockito정리

Junit -자바의 단위 테스트를 위한 라이브러리 Junit의 assert 메소드 assertEquals(A,B) - 객체 A와 B가 같은 값을 가지고 있는지 확인 Task task = new Task(); task.setTitle("test"); task.setId(1L); assertEquals(task.getTitle(), "test"); assertEquals(task.getId(), 1L); assertArrayEquals(A,B) - 배열 A와 B의 값이 같은지 확인 List<Test> arrA = new ArrayList<>(); List<Test> arrB = new ArrayList<>(); Test testA = new Test(); testA.setTitle("testA"); testA.setId(1L); arrA.add(testA); arrB.add(testA); assertArrayEquals(arrA.toArray(),arrB.toArray()); asser

Naver Blog

@SpringBootTest, @WebMvcTest

@SpringBootTest 목적 : 애플리케이션의 모든 컨텍스트를 로드하여 통합 테스트를 실행한다. @WebMvcTest 특정 컨트롤러 레이어만 테스트한다. service, repository 계층은 포함되지 않으며 필요하면 @MockBean으로 주입해야한다. 같이 사용할경우 @SpringBootTest와 @WebMvcTest는 서로 다른 컨텍스트 부트스트래퍼(@BootstrapWith)를 사용한다. IlleagalStateException 발생한다. Configuration error: found multiple declarations of @BootstrapWith 이 메시지는 두개의 컨텍스트가 설정이 충돌했음을 나타냄.

Naver Blog

Spring 3.2 매개변수 이름 인식문제

java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either. Spring Boot 3.2 부터 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할수있다. @RequestParam @RequestMapping("/request") public String request(@RequestParam("username") String username(){ } 애노테이션에 username이라는 이름이 명확하게 있음. 문제없이 작동 @RequestMapping("/request") public String request(@RequestParam String username){ } @RequestMapping("/request") public St

Naver Blog

Controller vs RestController

1.개요 Spring MVC의 @RestController은 @Controller와 @ResponseBody 조합입니다. Spring 프레임워크에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었습니다. 가장 큰 차이점은 @Controller는 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송합니다. @Controller와 @ResponseBody를 사용하여 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController을 도입하였다. // 다음 두 코드는 동일한 동작을 한다. @Controller @ResponseBody public class MVCController{ logic.

Naver Blog

MIME type, Content-type 에 대해서

MIME Type (Multipurpose Internet Mail Extension)이란? - 오직 텍스트만 보낼수 있었던 SMTP의 단점을 보완하여, 메시지 내부에 다른 파일을 전송할 수 있도록 하는 전자메일 프로토콜. - MIME으로 인코딩한 파일은 Content-type 필드를 헤더에 담게 되며, 이를 통해 전송된 자원의 형식을 명시할 수 있다. - 현재는 단순히 전자메일에 국한되지 않고, 웹을 통해 여러 형태의 파일을 전송하는데 쓰인다. MIME을 사용하는 이유? 과거에는 ASCII 문자로 이루어진 파일만을 전송하는 것을 전제로 데이터를 교환하는 시스템이 설계되었다. 하지만 네트워크를 통해서 텍스트 파일이 아닌, 바이너리 파일을 전송하는 경우가 잦아짐. 인터넷을 통해 전송 가능한 문자는 오로지 ASCII 표준이기 때문에, 다른 데이터를 이로 변환하는 과정이 필요해졌음. 따라서 바이너리 파일을 텍스트 파일로 변환하는 과정(인코딩)과 변환된 텍스트 파일을 다시 바이너리 파일로

Naver Blog

C# Delegate, Func, Action, Invoke()

C# Delegate의 개념 C# Delegate는 C/C++의 함수 포인터와 비슷한 개념으로 메서드 파라미터와 리턴 타입에 대한 정의를 한 후, 동일한 파라미터와 리턴타입을 가진 메서드를 서로 호환해서 불러서 쓸수 있는 기능이다. 그래서 메서드를 변수처럼 저장하고 호출할 수 있다. "델리게이트는 (참조형)타입이다." 타입(자료형) int,float과 같이 타입을 만드는것이다. 델리게이트 사용이유 콜백함수를 구현하는데 델리게이트를 사용한다. 콜백(CallBack) : 함수를 먼저 참조하고 나중에 호출한다 사용방법 1. Delegate 선언 // Delegate 타입 정의 public delegate void MyDelegate(string message); // 선언한 Delegate변수 객체 선언 public MyDelegate _myDelegate; 2. Delegate 인스턴스 생성 및 사용 public class Program { public delegate void MyDe

Naver Blog

7장 분산 시스템을 위한 유일 ID 생성기 설계

분산시스템에서 유일 ID를 생성하는 방법은 DB에 설정된 auto increment 속성으로 기본키을 쓰면 되지 않을까라는 생각을하지만, 이런 경우에 문제가 발생한다. 1. 데이터베이스 서버 한대로 요구를 담당할수 없다. 2. 여러 데이터베이스 서버를 쓰는 경우에는 지연시간(delay)을 낮추기가 무척 힘듬. 1.요구사항 ID는 유일해야한다. ID는 숫자로만 구성되어야한다. ID는 64비트로 표현할수 있는 값이어야 한다. ID는 발급 날짜에 따라 정렬 가능해야 한다. 초당 10,000개의 ID를 만들 수 있어야한다. 다중 마스터 복제 (multi-master-replication) 데이터베이스의 auto-increment 데이터베이스 서버의 수 만큼 증가시키는 방법. 해당 서버가 생성한 이전 ID값에 전체 서버의 수를 더한 값이 된다. 장점 - 데이터베이스 수를 늘리면 초당 생성 가능 ID 수를 늘릴 수 있음 단점 - 여러 데이터 센터에 걸쳐 규모를 늘리기 어렵다. - ID의 유일성

Naver Blog

LINQ Query

LINQ 쿼리는 C#의 새로운 키워드 from, where, orderby, groupby, join, select 등을 이용하여 데이타소스에 대한 쿼리를 실행한다. LINQ 쿼리는 일반 SQL Select문과 다르게 from 절이 가장 먼저 나오고 where절과 같은 조건문들이 다음으로 나오고, select문이 가장 마지막에 온다. // 서울에 사는 모든 회원의 이름을 가져오기 var names = from m in Memebers where City == "서울" select m.Name; LINQ to SQL에서 각 테이블에 엑세스하기 위해서는 먼저 DataContext 객체를 생성해야 한다. DataContext는 디폴트로 .dbml을 생성할때 사용한 파일명을 기준으로 생긴다.

Naver Blog

Java Lamda(람다식)

람다식이란? 람다식은 메소드를 하나의 식(expression)으로 표현한 것이다. int[] arr = new int[5]; Arrays.setAll(arr, i -> (int)(Math.random() * 5) + 1); 메소드를 람다식으로 표현하면 메소드의 이름과 반환값이 없으므로, 람다식을 '익명함수' (anonymous function)이라고 한다. 위 람다식을 메서드로 표현하면 아래와 같음 int method(){ return (int)(Math.random() * 5) + 1; } 람다식 기본문법 람다식은 매개변수, 화살표 -> , 실행문으로 구성된다. 2개이상의 매개변수를 사용할때는 괄호를 넣어야하며, 매개변수가 없는 경우에는 ()로 매개변수 부분을 표현하면 된다. 람다식 작성 // 메소드 반환타입 메소드명(매개변수 선언){ 문장 } // 람다식 (매개변수 선언) -> { 문장 } 메소드에서 이름과 반환타입을 삭제하고 매개변수 선언부와 몸통 { } 사이에 '->' 화살표

Naver Blog

확장메서드(Extension Method)

확장메서드 기존 클래스의 기능을 확장하기 위해서는 상속을 이용, 하지만 1. 상속으로 기능확장을 하기 어려운경우 2. 상속으로 기능을 확장할 경우 코드 수정이 필요하다. 이때 확장메서드를 사용한다. 확장메서드를 생성하는 방법 1. static class 2. static method 3. 첫번째 매개변수 this 키워드 public class ExtensionTest { public class Player { public void move() { Debug.Log("Player is moving"); } } public class AdvancedPlayer : Player { public void Jump() { Debug.Log("Player is Jumping"); } } private void Start() { //기존 메서드는 Player 클래스를 사용 Player player = new Player(); player.move(); //새로운 기능인 Jump를 사용하려면 Ad

Naver Blog

8장 URL 단축기 설계

1단계 문제 이해 및 설계 범위 확정 URL 단축 URL Redirection 높은 가용성과 규모 확장성, 장애 감내가 요구됨 단축 URL에는 숫자와 영문자를 사용할수 있음 단축된 URL은 삭제나 갱신을 할 수없다 개략적 측정 쓰기 연산: 매일 1억개의 단축 URL 생성 초당 쓰기: 1억(100million) / 24 / 3600 = 1160 읽기 연산 - 비율 설정: 읽기 연산과 쓰기 연산 비율이 10 : 1이라고 하자 - 그 경우 읽기 연산은 초당 1160 * 10 = 11600회 축약 전 URL의 평균 길이를 100이라고 가정 따라서 10년 동안 필요한 저장 용량은 3650억 * 100 바이트 = 36.5 TB이다. 2단계 개략적 설계안 제시 및 동의 구하기 API 엔드 포인트 URL 단축기는 기본적으로 두개의 엔드포인트를 필요로 한다. 1. URL 단축용 엔드포인트: 새 단축 URL을 생성하고자 하는 클라이언트는 이 엔드포인트에 단축할 URL을 인자로 실어서 POST 요청을

Naver Blog

Garbage Collection

가비지 컬렉션(Garbage Collection) - 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블록이나 객체를 찾아서 다시 사용가능한 자원으로 회수한다. JVM의 Heap 영역에서 사용중인 객체와 그렇지 않은 객체를 식별하고 사용하지 않는 객체를 삭제하는 프로세스를 말한다. 여기서 객체의 사용유무을 판별하기 위해 'Reachability' 라는 개념을 사용한다. 어떤 객체에 유효한 참조가 존재하면 'Reachable'로 그렇지 않으면 'Unreachable'로 구별하고 'Unreachable'한 객체를 GC대상으로 본다. Heap 메모리 구성 Young generation : 새로운 객체들이 이 영역에 할당된다. Eden과 2개의 Survival 0,1 영역으로 나누어 지며 Young 영역에서 일어나는 GC를 Minor GC라고 한다. Old generation : Young 영역에서 오랫동안 살아남은 객체들은 Old 영역으로 이동하게 된다. Young generation

Naver Blog

[intellij] spring Initializer 안뜨는 이유

Mac 에서는 preferences가 있지만, windows는 File-settings를 이용해야합니다. but IntelliJ Community 버전은 제공하지 않음. start.spring.io 에서 직접 생성

Naver Blog

Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package

ComponentScan이 지정되지 않아 스프링이 모든 파일을 검사하여 Bean을 찾기 때문에 생기는 오류다. 바로 소스들을 스프링 Application 실행파일을 java 폴더 바로 밑에 두지 않으면 된다. Component Scan의 Base Package는 모듈 패키지가 선택된다. https://hyeon9mak.github.io/woowahan-multi-module/ 우아한 멀티 모듈 세미나 정리 권용근님의 우아한 멀티 모듈 세미나를 보고 정리한 내용 hyeon9mak.github.io https://techblog.woowahan.com/2637/ 멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그 멀티 모듈 프로젝트를 처음 알게된 건 2017년 초였습니다. 당시에 저는 단일 프로젝트를 사용하고 있었습니다. 예를 들어 제가 회원 시스템을 개발 한다고 하면 member internal api member external api member b

Naver Blog

Java Scanner & BufferedReader

Java 에서 키보드로 입력받기 위해 보통 Scanner 클래스를 사용한다. 하지만 백준 알고리즘 풀다보면 종종 시간초과 문제가 발생한다. import java.util.Scanner; public class Input(){ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String input = sc.nextLine(); int age = sc.nextInt(); double height = sc.nextDouble(); float floatNum = sc.nextFloat(); scanner.close(); } } next + {자료형}() nextInt(), nextDouble()을 사용하였다. 뒤에 사용한 자료형에 맞는 값을 받을 수 있다. nextLine() 한줄을 통채로 받아온다. 개행문자 까지 받아올수 있다. next() 화이트 스페이스을 기준으로 한 단어를 받아온다. import

Naver Blog

2675 문자열 반복

package baekjun; import java.util.Scanner; public class Test2675 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); for(int i=0;i<t;i++) { int r = sc.nextInt(); String s = sc.next(); for(int j=0;j<s.length();j++) { for(int k=0;k<r;k++) { System.out.print(s.charAt(j)); } } } System.out.println(); sc.close(); } } 첫째 줄에 테스트 케이스 을 입력받는다. 각 테스트케이스의 반복횟수, 문자열 s가 공백으로 구분되어 주어진다. https://www.acmicpc.net/problem/2675 2675번: 문자열 반복 2675번 제출 맞힌 사람 숏코딩 재채점

Naver Blog

11721 열개씩 끊어 출력하기

package baekjun; import java.util.Scanner; public class Test11721 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); sc.close(); for(int i=0;i<s.length();i++) { System.out.print(s.charAt(i)); if(i%10 == 9) { System.out.println(); } } } } https://www.acmicpc.net/problem/11721 11721번: 열 개씩 끊어 출력하기 11721번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 질문 검색 열 개씩 끊어 출력하기 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 1 초 256 MB 63074 33396 28817 53.637% 문제 알파벳 소문자와 대문자로만 이루어진 길이가 N인 단어

Naver Blog

자바 charAt()

charAt() - String으로 저장된 문자열 중에서 한 글자만 선택해서 char 타입으로 변환해준다. String str = "Hello"; System.out.println(str.charAt(0)); // return H charAt() - ()안에 index번호 값이 들어간다. str.charAt(0) : str이 가리키고 있는 문자열에서 0번째에 있는 문자를 char 타입으로 변환한다. return H 해당 문자열에서 자신이 원하는 문자 하나만 가져오고 싶을때 charAt() 사용한다.

Naver Blog

2908 상수

package baekjun; import java.util.Scanner; public class Test2908 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num1 = sc.nextInt(); int num2 = sc.nextInt(); sc.close(); num1 = Integer.parseInt(new StringBuilder().append(num1).reverse().toString()); num2 = Integer.parseInt(new StringBuilder().append(num2).reverse().toString()); System.out.print(num1 > num2 ? num1 : num2); } } 문자열을 다루는 StringBuilder 클래스을 사용한다. 먼저 StringBuilder 생성과 동시에 append() 메소드로 값을 넣어준다. 그리

Naver Blog

Java StringBuilder

StringBuilder 사용하는 이유 - string은 불변(immutable) 객체라고 한다. 문자열 str1,str2 을 합칠때 새로운 String 객체을 생성한다. String str1 = "hello"; String str2 = "Kim"; String str3 = str1 + str2; StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업시 하나의 방법이 될수 있다. append() 문자열 추가 public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("Hello"); a.append(" World"); System.out.println(a); // Hello World } } delete() 매개변수로 전달받은 인덱스 사이의 문자열 제거 parameter : 인덱스 시작점, 인덱스 끝점 + 1 문자열에서 시작과 끝은

Naver Blog

2941 크로아티아 알파벳

크로아티아 알파벳의 갯수을 세어야 한다. 참조한는 index 가 벗어나지 않도록 해야한다. 3. 8개의 문자는 특정 조건에 의해 변경되어 하나의 문자을 이룬다. String str = input(); int cnt = 0; for (int i = 0; i < str.length(); i++) { if(str.charAt(i) == 'c') { // 만약 i번째 문자가 c 라면? if(str.charAt(i + 1) == '=') { //만약 다음 문자가 '=' 이라면? // i+1 까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 1 증가 i++; } else if(str.charAt(i + 1) == '-') { i++; } } count++; } 만약 aedzd=l=c 라는 문자을 입력받았다면 마지막 str.charAt(8) 을 통해 c 라는 문자을 받았기 때문에 첫번째 조건문을 통과시킨다. 하지만 다음 조건문인 if(str.charAt(i + 1) == '=') 에서 문제가

Naver Blog

5622 다이얼

package baekjun; import java.util.Scanner; public class Test5622 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String word = sc.next(); int time = 0; for(int i=0;i<word.length();i++) { char ch = word.charAt(i); if(ch == 'A' || ch == 'B' || ch == 'C') { time += 3; } else if(ch == 'D' || ch == 'E' || ch == 'F') { time += 4; } else if(ch == 'G' || ch == 'H' || ch == 'I') { time += 5; } else if(ch == 'J' || ch == 'K' || ch == 'L') { time += 6; } else if(ch == 'M' ||

Naver Blog

2798 블랙잭

package baekjun; import java.util.Scanner; public class Test2798 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] arr = new int[n]; int tmp = 0; for(int i=0;i<n;i++) { arr[i] = sc.nextInt(); } for(int i=0;i<n-2;i++) { for(int j=i+1;j<n-1;j++) { for(int k=j+1;k<n;k++) { int sum = arr[i] + arr[j] + arr[k]; if(sum <= m && tmp < sum) { tmp = sum; } } } } System.out.println(tmp); } } i,j,k 번째 카드의 합을 구한다. 만약 세 카드의 합이 M이랑

Naver Blog

2231 분해합

package baekjun; import java.util.Scanner; public class Test2231 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int result = 0; int size = String.valueOf(num).length(); //num의 자리수 구하기 3 int start = num - (size * 9); // 시작 최솟값 for(int i=start;i<num;i++) { int n = i; int sum = 0; while(n!=0) { sum += n % 10; n = n / 10; } if(sum + i == num) { result = i; break; } } System.out.println(result); } } 분해합은 N과 각 자릿수 값의 합이므로 최솟값은 N 에서 더 할수 있는 최대의 자

Naver Blog

JPA 기본키(PK) 매핑

기본키 매핑 @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; 1.직접할당 - @Id 만사용 2.자동생성 - @Id @GeneratedValue을 같이 사용 - 네가지 전략이 있다. 2.1 IDENTITY 개념 @GeneratedValue(strategy = GenerationType.IDENTITY) 기본키 생성을 데이터베이스에 위임 id 값을 null 로 하면 DB가 알아서 AUTO_INCREMENT 해준다. 특징 entityManager.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회한다. JPA는 보통 트랜잭션 commit 시점에 INSERT SQL 을 실행한다. 2.2 SEQUENCE @GeneratedValue(strategy = GenerationType.SEQUENCE) 데이터베이스 Sequence Object을 사용 DB Sequence는 유일한 값을 순서대로

Naver Blog

JDBC,JPA/Hibernate 차이

영속성(Persistence) 데이터을 생성한 프로그램이 종료되더라도 사리지지않는 데이터의 특성을 말한다. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어 버리게된다. 때문에 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터 베이스 등을 활용하면 데이터을 영구하게 저장하여 영속성 부여한다. 계층 참고 프레젠테이션 계층 (Presentation layer) - UI계층(UI layer) 애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 비즈니스 논리 계층 (Business logic layer) - 도메인 계층(Domain layer) 데이터 접근 계층 (Data Access layer) - 영속계층(Persistence Layer) Persistence Framework JDBC 프로그래밍의 복잡합이나 번거로움없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며

Naver Blog

[Spring]@Autowired @AllConstructor, @RequiredArgsConstructor, @NoArgsConstructor

생성자 주입(Constructor Injection) 단일 생성자인 경우 @Autowired 어노테이션을 붙이지 않아도 되지만, 생성자가 2개 이상인 경우에는 생성자에 어노테이션을 붙어주어야 한다. public class Example{ private HelloService helloService; public Example(HelloService helloService){ this.helloService = helloService; } } 필드주입(Field Injection) 필드주입 같은 경우 사용법이 간단하다. @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입이 된다. public class Example{ @Autowired private Example exmaple; } 수정자 주입(Setter Injection) 수정자 Setter을 이용한 주입 방법이다. 꼭 Setter 메서드일 필요는없지만 코드의 일관성을 위해 정확한 이름을 붙여주는게 좋다. publi

Naver Blog

Java HashSet

HashSet이란? HashSet은 Set인터페이스의 구현 클래스입니다. 그렇기에 Set의 성질을 그대로 상속받는다. Set은 객체를 중복해서 저장할수 없고 하나의 null 값만 저장할수 있습니다. 또한 저장순서가 유지되지 않습니다. 만약 요소의 저장 순서를 유지해야 한다면 LinkedHashSet 클래스를 사용하면 됩니다. Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데 HashSet의 경우 정렬을 해주지 않고 TreeSet의 경우 자동정렬을 해준다는 차이점이 있다. Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점이 있다. Set은 비선형구조이기 때문에 인덱스가 없으며 값을 추가하거나 삭제할때 값이 Set내부에 있는지 검색한 뒤 추가나 삭제를 해야하기 때문에 List구조에 비해 느리다. HashSet 선언 HashSet<Integer> set1 = new HashSet<Integer>(); // HashSet 생성 HashSet<Integer>

Naver Blog

String, StringBuffer, StringBuilder

String, StringBuffer,StringBuilder의 차이 String 객체는 한번 생성되면 할당된 공간이 변하지 않는다. StringBuffer, StringBuilder의 경우 객체의 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려준다. StringBuffer와 StringBuilder 차이 StringBuffer는 멀티스레드 상태에서 동기화를 지원한다. StringBuilder 단일 스레드 환경에서만 사용하도록 설계되어있다. String s = "Java"; s += "Eclipse"; String 은 크기가 고정되어 있기때문에 내부에서 문자열을 수정할수 없다. Java에 Eclipse를 추가하면 s의값이 JavaEclipse가 되는 것이 아니다. String 객체는 내부데이터를 수정할수 없기 때문에 "JAVAEclipse"라는 새로운 String 객체가 생성되고 data변수는 새로운 String 객체를 참조하게 된다. 기존에 있던 String 객체는 참조되지 않

Naver Blog

HashMap

HashMap이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있다. Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조입니다. 키와 값은 모두 객체이다. 값은 중복 저장될수 있지만 키는 중복이 될수 없다. 만약 저장된 키와 같은 값의 키를 등록하면 기존의 값은 없어지고 새로운 값으로 대체된다. HashMap은 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여준다. HashMap 사용법 HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성 HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능 HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 Has

Naver Blog

K진수에서 소수 개수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/92335 코딩테스트 연습 - k진수에서 소수 개수 구하기 문제 설명 양의 정수 n 이 주어집니다. 이 숫자를 k 진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0 처럼 소수 양쪽에 0이 있는 경우 P0 처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우 0P 처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우 P 처럼 소수 양쪽에 아무것도 없는 경우 단, P 는 각 자릿수에 0을 포함하지 않는 소수입니다. 예를 들어, 101은 P 가 될 수 없습니다. 예를 들어, 437674을 3진수로 바꾸면 211... school.programmers.co.kr 풀이 k 진수 변환 0P0, P0, 0P, P의 수 찾기 --> 0을 기준으로 구분되는 수 소수인지 확인 k진수 변환 입력값이 0이 될때까지 k

Naver Blog

Bean, IOC(Inversion of Control) , 의존성주입(Depenpency Injection)

IoC 란? IoC란 (Inversion of Control)은 제어의 역전이라고 불린다. Spring 애플리케이션에서는 오브젝트(빈)의 생성과 의존관계설정,사용,제거 등의 작업을 Spring Container가 담당한다. 이를 Spring Container가 코드대신 객체에 대한 제어권을 갖고 있다고 해서 IoC라고 불린다. 따라서 Spring Container을 (IoC Container,DI Container)라고도 부른다 내가 쓸놈은 내가 만들어서 쓴다. class AnimalController{ private AnimalRepository = new AnimalRepository(); } class AnimalController{ private AnimalRepository repo; public AnimalController(AnimalRepostiory repo){ this.repo = repo; } } IOC 컨테이너 : Bean (컨테이너 내부에서 만든 객체들) 의존

Naver Blog

[Java] getOrDefault

getOrDefault - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 getOrDefault(Object key, V DefaultValue) 매개변수 : 이 메서드는 두개의 매개변수을 허용한다. key : 값을 가져와야하는 요소의 키이다. defaultvalue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다. 반환값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값을 반환한다. import java.util.HashMap; public class MapGetOrDefaultEx { public static void main(String arg[]) { String [] alphabet = { "A", "B", "C" ,"A","A","B"}; HashMap<String, Integer> map= new HashMap<>(); for(String s: alphabet) map.pu

Naver Blog

애플리케이션 컨텍스트(Application Context),싱글톤(Singleton)

애플리케이션 컨텍스트란? Spring에서는 Bean의 생성과 관계설정 같은 제어를 담당하는 IoC 컨테이너인 Bean Factory가 존재한다. 하지만 Bean의 생성과 관계설정 외에 추가적인 기능이 필요한데, 이러한 이유로 Spring에서는 Bean Factory를 상속받아 확장한 애플리케이션 컨텍스트(Application Context)를 주로 사용한다. 애플리케이션 컨텍스트는 별도의 설정 정보를 참고하고 빈의 생성과, 관계설정 등의 제어 작업을 총괄한다. 애플리케이션 컨텍스트는 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고, 생성정보와 연관관계 정보에 대한 설정을 읽어 처리한다. 대표적으로 @Configuration과 같은 어노테이션이 대표적인 IoC의 설정정보이다 Bean 요청시 처리과정 https://mangkyu.tistory.com/151 1. Application Context는 @Configuration이 붙은 클래스들을 설정정보로 등록해두고, @Bean이 붙

Naver Blog

Java Queue 클래스

Queue란? Queue의 사전적 의미는 무엇을 기다리는 사람, 차량 등의 줄 혹은 서서 기다리는 것을 의미한다. 이와같이 줄을 서서 순서대로 처리하는 것이 큐라는 자료구조이다. 큐는 FIFO(First In First Out)의 형태를 가진다. 말 그대로 먼저 들어온 데이터가 가장 먼저 나가는 구조를 말한다. Enqueue : 큐 맨 뒤에 데이터 추가 Dequeue : 큐 맨 앞쪽의 데이터 삭제 Queue의 특징 1. 먼저 들어간 자료가 먼저 나오는 구조 FIFO(First In First Out)구조 2. 큐의 한쪽 끝은 프런트로(front) 정하여 삭제 연산만 수행함 3. 다른 한쪽 끝은 리어(rear)로 정하여 삽입 연산만 수행함 4. 넢이우선탐색(BFS)의 구현에 사용 5. 컴퓨터 버퍼에서 주로 사용, 입력이 되었으나 처리를 하지 못할때, 버퍼(큐)를 만들어 대기 시킴 Queue 선언 import java.util.LinkedList; import java.util.Queu

Naver Blog

자바 Stack 클래스

Stack이란? Stack의 사전적 정의는 '쌓다', '더미' 입니다. 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료구조라고 할수있습니다. LIFO(Last In First Out)의 형태를 띈다. Stack 특징 1. 먼저들어간 자료가 나중에 나옴 LIFO(Last In First Out)구조 2. 깊이우선탐색(DFS)에서 사용 3. 재귀적 함수을 호출할때 사용 Stack선언 import java.util.Stack; Stack<Integer> stack = new Stack<>(); Stack<String> stack = new Stack<>(); Stack 값 추가 Stack<Integer> stack = new Stack<>(); stack.push(1); // stack 값 1추가 stack.push(2); // stack 값 2추가 stack.push(3); // stack 값 3추가 Stack 값 삭제 Stack<Integer> stack = new Stack<>();

Naver Blog

StringTokenizer

StringTokenizer BufferedReader 클래스의 메서드로 입력을 읽어들이면, 라인 단위로 읽어드릴수밖에 없다. 라인단위가 아닌 스페이스 기준으로 문자열을 분리한다던가 필요할때 사용한다. StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스이다. 그렇게 쪼개진 문자열을 우리는 토큰(Token) 이라고 부른다. StringTokenizer를 사용하기 위해서는 java.util.StringTokenizer;를 import 해야한다. String : 문자열을 Tokenizer : 토큰화한다 정리하면 토큰은 분리된 문자열 조각으로 StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스인거죠. 1. StringTokenizer st = new StringTokenizer(문자열); // 띄어쓰기 기준으로 문자열분리 2. StringTokenizer st = new StringTokenizer(문자열, 구

Naver Blog

Java 거듭제곱 구하기 Math.pow()

자바에서 특정값의 제곱을 구하려면 java.lang.Math 클래스의 pow() 메소드를 사용하면 된다. public class Main{ public static void main(String[] args){ double ans = Math.pow(2,4); 2의 4제곱 System.out.println("2의 제곱은:" + ans); // 16.0 } } Math.pow( 대상숫자, 지수 ) 메소드는 입력값과 출력값이 모두 double 형이다.

Naver Blog

HTTP 상태 401(Unauthorized) vs 403(Forbidden) 차이

HTTP 상태 401이란? HTTP 상태 401(Unauthorized)는 클라이언트가 인증되지 않았거나, 유효한 인증정보가 부족하여 요청이 거부 되었음을 의미하는 상태값이다. 즉 클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다고 알려준다. 예시로 쇼핑몰에서 로그인을하지 않고 나의 결제 내역과 같은 정보을 요청하면 볼수있다. HTTP 상태 403이란? HTTP 상태 403(Forbidden)는 서버가 해당요청을 이해했지만, 권한이 없어 요청이 거부되었음을 의미하는 상태이다. 즉 클라이언트가 해당 요청에 대한 권한이 없다고 알려주는 것이다. 쇼핑몰에 로그인하여 인증을 하였지만 접근권한이 없는 정보을 요청할경우 반환받는다. https://mangkyu.tistory.com/146 https://mangkyu.tistory.com/146 [HTTP] HTTP 상태 401(Unauthorized) vs 403(Forbidden) 차이 1. HTTP 상태 401(Unau

Naver Blog

Java Integer.parseInt(), Integer.valueOf() 차이

자바에서 문자열을 정수형으로 변형할때 두 메서드을 사용한다. 원시데이터가 필요하면 parseInt(), 객체가 필요하면 valueOf()을 사용. parseInt(): 원시 데이터인 int 타입을 변환 valueOf(): Integer 래퍼(wrapper)객체를 반환

Naver Blog

특정문자위치 찾기(indexOf, lastIndexOf)

indexOf() indexOf()는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환하며 찾지 못할경우 -1을 반환한다. public class IndexOfTest{ public static void main(String[] args){ String indexOfTestOne = "Hello world"; String indexOfTestTwo = " Hello world "; System.out.println( indexOfTestOne.indexOf("o") ); // 4 System.out.println( indexOfTestOne.indexOf("x") ); // -1 System.out.println( indexOfTestOne.indexOf("o",5) ); // 7 System.out.println( indexOfTestTwo.indexOf("o") ); // 13 System.out.println( indexOfTestTwo.indexOf("el") );

Naver Blog

동시성 제어 문제

질문) 동시에 같은 DB Table Row를 업데이트 하는 상황을 방어하기 위해서 어떻게 개발하실 건지 설명해주세요. 트랜잭션 사용 비관적인 락(Pessimistic Lock) 동작방식 트랜잭션이 데이터를 읽을때, 해당 데이터를 잠금(Lock) 상태로 만든다. 이로써 다른 트랜잭션은 해당 데이터에 대한 읽기 쓰기 권한을 얻을수 없다. 트랜잭션은 데이터를 사용하고 난후에 잠금을 해제한다. 2. 장점: - 트랜잭션간에 충동을 방지하며, 데이터의 일관성을 유지할수있음. - 간단하게 사용가능하고, 동시성 문제를 해결하기 위해 명시적인 잠금을 사용합니다. 3. 단점: - 잠금이 오래 지속되면 다른 트랜잭션들이 대기해야 하므로 성능저하가 발생할수 있다. - 락 충돌이 자주 발생하며 성능 문제 및 데드락 등의 부작용이 발생할수 있다. 낙관적인 락 (Optimistic Lock) 1. 동작방식: - 트랜잭션이 데이터를 읽을 때, 어떤 락도 걸지 않고 데이터를 수정할 때까지 기다리지 않습니다. -

Naver Blog

TCP와 UDP의 차이

OSI 7계층 중 4계층에서 동작하는 프로토콜의 목적은 목적지 단말 안에서 동작하는 여러 애플리케이션 프로세스 중 통신해야 할 목적지 프로세스를 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내는 것 4계층 프로토콜(TCP, UDP)과 서비스 포트 TCP/IP 프로토콜 스택에서 4계층은 TCP와 UDP가 담당하는데, 4계층의 목적은 목적지를 찾아가는 주소가 아니라 애플리케이션에서 사용하는 프로세스를 정확히 찾아가고 데이터를 분할한 패킷을 잘 쪼개 보내고 잘 조립하는 것이다. 패킷을 분할하고 조립하기 위해 TCP프로토콜에서는 시퀀스 번호와 ACK번호를 사용한다. TCP - 신뢰할수 있다. -> 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션을 안전하게 연결하고 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있다. - 패킷에 번호(Sequence Number)를 부여해서 전송 사태를 확인한다. - 잘 전송되었는지에 대한 응답

Naver Blog

DNS 동작과정

1. 사용자는 도메인 이름을 이용하여 웹사이트에 접속한다. 이 접속을 위해 도메인 이름을 DNS에 질의하여 IP 주소로 변환하는 과정이 필요하다. DNS는 third party가 제공하는 유료 서비스이다. 2. DNS 조회 결과로 IP 주소가 반환되고 이 주소는 웹 서버는 주소이다. 3. 해당 IP 주소로 HTTP 요청이 전달된다. 4. 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다. DNS란? Domain Name System의 약자로 TCP/IP 네트워크에서 사용되는 네임 서비스의 구조다. 우리가 인터넷을 편리하게 쓰게 해주는 기능으로 영문, 한글 주소를 IP 네트워크에서 찾아갈 수 있는 IP주소로 변환해 준다. 이 DNS를 운영하는 서버를 네임서버라고 한다. 모든 단말은 DNS서버의 IP주소가 설정되어 있어야 한다. 보통 PC는 DHCP 프로토콜로 IP주소를 할당 받으면서 DNS 서버 IP 주소를 DHCP Option 6를 통해 받는다. www.nav

Naver Blog

프로세스와 스레드(Process vs Thread)

프로세스와 스레드의 차이(Process vs Thread) 프로그램이란? 어떤작업을 위해 실행할 수 있는 파일 프로세스란? 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 운영체제로부터 시스템 자원을 할당받는 작업의 단위 즉, 동적인 개념으로는 실행된 프로그램을 의미한다. ※특징 프로세스(Code + Data + Stack + Heap) 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할수 없다. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process-communication)을 사용해야 한다. ex) 파이프, 파일, 소켓, 등을 이용한 통신 방법 이용 스

Naver Blog

Web API

직렬화 / 역직렬화 RESTful 서비스는 본질적으로 HTTP통신에 기반하기 때문에, 통신 메시지 자체는 모두 일정한 형식을 갖는 텍스트문서이다. 즉, 통신메시지는 Http 프로토콜에서 요구하는 형식을 갖춘 "문자열"이다. HTTP가 요구하는 텍스트 문서(HTML)의 구조는 헤더 섹션으로 시작하며, 몇개의 줄 바꿈 문자와 실질적인 운반 데이터(페이로드, Payload)를 담는 "바디"로 구성되는데 RESTful 서버는 요청받은 데이터를 바다에 실어 클라이언트에게 전달하게 된다. 그런데, 서버가 보내는 데이터는 원래 서버 내부에서 객체 형태로 존재하던 것들이다. 서버는 자신이 보유한 객체(런타임 객체)를 문자열로 변환한 다음 이를 바디에 적재하여, 통신메시지를 응답한다. 이때 객체를 -> 문자열로 변환하는 것을 직렬화(Serialization)라고 한다. 반면, 클라이언트는 서버가 응답한 문자열을 다시 객체로 변환해야 자신의 내부에서 런타임 객체로 사용가능한데, 문자열을 객체로 환원하

Naver Blog

엔티티 관계(Entity Relationship )

Principal Entity: 부모 엔티티 Dependent Entity: 자식 엔티티, FK 프로퍼티를 가진다. Navigation Properties: PK, FK처럼 테이블의 컬럼에는 존재하지 않으나, EFCore의 관계이동 기능 수행용 프로퍼티 * EFCore에서 "관계성" relationship은 두개의 Endpoint을 가지며, 양쪽의 각 endpoint는 navigation properties를 통해서 관계를 형성시킴. public class Employee{ public int EmployeeId {get; set;} public string Name {get; set;} public DepartmentId {get; set;} public virtual Department Department {get; set;} } public class Department { public int DepartmentId {get; set;} public string Name {ge

Naver Blog

Postgresql 설치, 기본설정

Ubuntu에 설치할 Postgresql 버전확인 $ apt show postgresql Ubuntu에 postgresql 설치 $ sudo apt-get install postgresql 특정버전의 Postgresql를 설치하면 아래와 같이 작성 $sudo apt-get -y install postgresql -14 재시작 $ systemctl restart postgresql Postgresql 실행 sudo service postgresql start Postgresql 상태확인 sudo service postgresql status Postgresql 종료 sudo service postgresql stop

Naver Blog

PostgreSql 로그인

psql은 커멘드 라인 기반으로 PostgreSQL에 작성된 데이터베이스에 연결하거나 테이블에서 데이터를 검색 등을 할수있는 도구이다. psql -h {호스트명} -p {포트번호} -U {사용자명} -d {데이터베이스명} 호스트명은 PostgreSQL가 실행중인 호스트명 또는 IP 주소이다. 기본값은 localhost 이기에 로컬 호스트에서 실행중인 PostgreSQL에 접속하는 경우는 생략 할 수 있다. 포트번호는 PostgreSQL가 사용하는 포트 번호이다. 기본 값이 PostgreSQL 설치시 설정한 값인 5432로 되어 있기에 다른 포트 번호를 사용하는 경우가 아니라면 생략할수 있다. 사용자명은 PostgreSQL을 설치 한 직후에는 수퍼유저로 postgres 역할 밖에 생성되지 않으므로 -U postgres로 지정한다. 사용자명을 생략하게 되면 OS의 사용자명이 사용된다. localhost라면 호스트명 지정을 생략할수 있고, 포트번호를 생략할수 있다. 사용자명과 같은 데이터

Naver Blog

Psql 옵션목록

psql [option] .. [DBName[USERNAME]] 일반옵션: -c, --command=COMMAND 하나의 명령(SQL 또는 내부명령)만 실행하고 끝냄. -d, --dbname=DBNAME -f --file 파일안에 지정한 명령을 실행하고 끝냄 -l --list 사용가능한 데이터베이스 목록을 표시하고 끝냄 -v --set -V --version 버전 정보를 보여주고 마침 -X, --no-psqlrc 시작파일을 읽지 않음 -1 ("one"), --single-transaction 명령 파일을 하나의 트랜잭션으로 실행 -? --help[=options] 이 도움말을 표시하고 종료 입출력옵션: -a, --echo-all : 스크립트의 모든 입력 표시 -b, --echo-errors : 실패한 명령들 출력 -e, --echo-queries : 서버로 보낸 명령 표시 -E, --echo-hidden : 내부 명령이 생성하는 쿼리 표시 -L, --log-file=FILENAME

Naver Blog

1장. 사용자 수에 따른 규모 확장성

단일서버 모든 컴포넌트가 한대의 서버에서 실행되는 방식. 많은 사용자가 이용한다면 트래픽을 처리하기 어렵고, 가용성 fail over가 불가능하여 실제 서비스에서는 사용하지않음. 사용자가 증가함에 따라 각자의 확장성을 위해서 서버와 데이터베이스를 분리한다. ※ 어떤 DB를 사용할 것인가? - 전통적으로 RDB를 많이 사용했지만, 최근에는 성능,기능,비즈니스 요건에 따라 NoSQL 등 다양한 DB를 사용. - NoSQL은 Key-value Store, Graph Store, Column Store, Document Store등 다양한 구조의 DB가 존재한다. 수직적 규모 확장 vs 수평적 규모 확장 스케일 업(Scale up) - CPU, Memory 등 다양한 고사양의 자원을 추가한다. 장점: 단순한다 단점: 한대의 서버에 CPU나 메모리를 무한대로 증설할 수없으므로 한계가 있다. 다중화 불가 스캐일 아웃(Scale out) - 새로운 서버를 새로 증설하여 수평적으로 자원을 추가 확

Naver Blog

2장. 개략적인 규모 측정

개략적이 규모 측정 - 보편적으로 통용되는 성능 수치상에서 사고 실험을 행하여 추정치를 계산하는 행위로서, 어떤 설계가 요구사항에 부합할 것인지 보기 위한 것. 개략적인 규모 추정을 효과적으로 해내려면 2의 제곱수, 응답지연 값, 가용성에 관계된 수치들을 기본적으로 잘 이해하고 있어야 한다. 2의 제곱수 분산 시스템에서 다루는 데이터 양은 엄청나게 커질수 있으나, 계산법은 크게 벗어나지 않는다. 모든 프로그래머가 알아야 하는 응답지연 값 구글의 제프 딘이 2010년에 통상적은 컴퓨터에서 구현된 연산들의 응답지연 값을 공개한 바가 있다. 해당 수치들은 컴퓨터 연산들의 처리 속도가 어느 정도인지 짐작할 수 있도록 해준다. 이러한 수치가 2020년에 시각화되었는데, 해당 수치들을 분석하면 아래 결과가 나온다. 메모리는 빠르지만 디스크는 아직 느리다. 디스크 탐색은 가능한 한 피하라. 단순한 압축 알고리즘은 빠르다. 데이터를 인터넷으로 전송하기 전에 가능하면 압축하라. 데이터 센터는 보통

Naver Blog

3장 시스템 설계 면접 공략법

시스템 설계 면접 기술적 측면 이상으로 지원자가 협렵에 적합한 사람인지, 압박이 심한 상황도 잘 헤쳐나가는지, 좋은 질문을 던질 능력이 있는지 부정적인 것 설계의 순수성에 집착한 나머지 타협적 결정을 도외시하고 오버 엔지니어링을 하는 엔지니어링들이 협업에도 많다. 오버 엔지니어링의 결과로 시스템 전반의 비용이 올라간다. 상당수 회사들은 값비싼 대가를 치르고 있다. 효과적 면접을 위한 4단계 접근법 1단계: 문제 이해 및 설계 범위 확정 바로 답부터 들이밀지 말자. 속도를 늦추자. 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하자. 가장 중요한 기술 중 하나는 올바른 질문을 하는 것. 적절한 가정을 하는 것. 그리고 시스템 구축에 필요한 정보를 모으는 것. 이 단계에서는 요구사항을 이해하고 모호함을 없애는 게 이 단계에서 가장 중요하다. Ex) 뉴스피드 시스템 설계 질문 웹, 앱 중 어느 쪽을 지원해야 하는가? 가장 중요한 기능이 무엇인가? 뉴스피드의 정렬상태는 어떻게 되야하는가

Naver Blog

[MAUI] Binding

바인딩 구성 3요소 1) Source - 바인딩소스는 모든 접근 대상이 될수있음. 데이터의 변경이 발생하는 개체이다. 일반적으로 ViewModel이 원본역할을 한다. 2) Target - 원본의 변경내용을 반영하는 개체입니다. 일반적으로 View가 대상 역할을 한다. Must be a BindableProperty in Bindable Object 3) Path - 바인딩되는 Source의 대상데이터 경로 / 변수 Reference는 바인딩이 있는 동일 XAML 파일내의 다른 위치에 있는 element/컨트롤의 이름으로 지정해서 사용됨. <Label Rotation="{Binding Source={x:Reference slider1}, Path=Value}"/> <Slider x:Name="slider1"/> 바인딩 모드 Oneway : Source --> Target OnewayToSource : Source <-- Target Twoway : Source <----> Target

Naver Blog

[MAUI] CollectionView안에 RadioButton 정의

DataTemplate 안에 RadioButto이 있으며, SportTitle 프로퍼티는 ControlTemplate안에 있으므로 TemplateBinding을 사용해야 한다. <CollectionView ItemsSource="{Binding SportsList}" ItemsLayout="HorizontalGrid" RadioButtonGroup.GroupName="SportsListGroups" RadioButtonGroup.SelectedValue="{Binding SelectedSport}"> <CollectionView.ItemTemplate> <DataTemplate x:DataType="model:SportsList" > <RadioButton Content="{Binding SportTitle}" Value="{Binding SportTitle}" CheckedChanged="RadioButton_CheckedChanged"> <RadioButton.ControlTem

Naver Blog

4장 처리율 제한 장치의 설계

처리율 제한 장치(Rate Limiter) 네트워크 시스템에서 처리율 제한장치는 클라이언트 또는 서비스가 보내는 트래픽의 처리율(rate)을 제엏하기 위한 장치다. 정해진 임계치(threshold)를 넘어서면 추가로 도달한 모든 호출은 처리가 중단 Ex) 같은 디바이스로는 주당 5회 이상 리워드(reward)를 요청할수 없다. 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 IP주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 처리율 제한 장치의 사용이유? Dos(Denial of Service) 공격에 의한 자원 고갈을 방지할수 있다. 서버 과부하를 막는다. 봇, 크롤러 등에서 오는 잘못된 이용 패턴으로 유발된 트래픽을 제한한다. 비용을 절감할 수 있다. 처리를 제한해 서버를 많이 두지 않고, 우선순위가 높은 API에 더 많은 자원을 할당할 수 있다. 특히 요청 당 비용이드는 Third party API를 사용하고 있는 경우, 횟수 제한을 통해 과도한 비용을 막을수 있

Naver Blog

5장 안정 해시 설계

해시 키 재배치 문제 N개의 캐시 서버가 있다고 할때, 이 서버들에 부하를 균등하게 나누는 보편적인 방법은 아래와 같은 해시 함수를 사용하는 것이다. serverIndex = hash(key) % N 위와 같은 방법의 단점 - 서버 풀의 개수가 고정되어 있을 때에나 부하를 균등하게 나눌 수 있다. 만약 한 서버에 이상이 발생하여 서버 풀의 개수가 줄어들거나, 트래픽이 몰려서 서버 풀의 개수를 늘려야 한다면? - 해당서버에 존재하던 해시 키가 사라지고, 엉뚱한 서버로 접근하게 되어 대규모 캐시 미스가 발생하게 되므로 대량의 리밸런싱이 이루어져야 한다. 안정해시(Consistent Hash) 안정 해시는 해시 테이블의 크기가 조정될 때 평균적으로 k/n개의 키만 재배치한는 해시 기술이다. (k=키의 개수, n=슬롯 개수) 키의 위치에서 링을 시계 방향으로 탐색하다 만나는 최초의 서버가 키가 저장될 서버다. 레디스의 데이터를 어플리케이션 레이어에서 분산 시킬 때 사용할 수 있다. 키가 저

Naver Blog

6장 키-값 저장소 설계

1키-값 저장소란? 키-값 저장소(key-value store)는 비 관계형 데이터베이스다. 고유식별자(identifier)를 키로 갖는다. 키와 값 사이의 연결관계를 키-값 쌍(pair)이라고 한다. 키-값 저장소의 대표적사례는 아마존 다이나모, memcached, redis가 있다. 키의 길이는 어느 정도가 적절할까? 성능상 이유로 키는 짧을수록 좋다. 키-값 저장소 설계 요구사항 키-값 쌍의 크기는 10KB 이하 큰 데이터 저장 가능 높은 가용성(장애 시에도 빠르게 응답) 데이터 일관성 수준 조절 가능 응답 지연시간(latency) 최소 단일 키-값 저장소 먼저 한 대의 서버만 사용하는 키-값 저장소를 설계해보자. 메모리에 해시 테이블로 키-값 쌍을 모두 저장하는 것은 어떨까? 위 방법은 빠르지만, 모든 데이터를 메모리에 저장하는 것은 현실적으로 불가능하다. 이 문제점을 해결하는 방법은 다음과 같다. 데이터 압축 데이터를 메모리와 디스크에 분할하여 저장 단일 키-값 저장소는 한

Naver Blog

OAuth

1) OAuth2.0 개념 OAuth2.0(Open Authorization 2.0)는 인증을 위한 개방형 표준 프로토콜이다. 이 프로토콜에서는 Third-Party 프로그램에게 리소스 소유자를 대신해 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식으로 작동된다. 구글,페이스북 등 외부 소셜계정을 기반으로 간편하게 인증하는 기능이다. 기존의 인증방식과 달리 인증을 중개하는 방식이다. 소셜 서비스에서 인증(Authentication)을 대신 해주지만 클라이언트 정보가 서버에 저장되는 것은 기존 인증방식과 동일하다. 즉, 서버에서 접근 권한 관리(Authorization)은 여전히 서버가 담당해야할 부분이다. 3) 역할 이름 설명 Resource Owner 인증을 수행하는 주체 리소스 소유자이다. 본인의 정보에 접근하 수 있는 자격을 승인하는 주체이다. 예) 구글 로그인을 할 사용자를 의미한다. Resource Owner는 클라이언트를 인증(Authorize)하는 역할을

Naver Blog

Oauth2.0 Maui 구현 Web Authenticator

Web authenticator .net maui 에서 웹 기반 인증을 처리하는 기능을 제공. OAuth 2.0을 구현할수있다. WebAuthenticator는 사용자가 브라우저를 통해 인증을 수행하고, 인증이 완료되면 애플리케이션으로 돌아올 수 있도록 한다. WebAuthentictor을 하려면 플랫폼별 설정이 필요하다. Platforms - Android - WebAuthenticationCallBackActivity 클래스 생성 namespace Woodle.Owner.Platforms.Android { [Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop, Exported = true)] [IntentFilter(new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataScheme = "m

Naver Blog

커스텀 URL 스킴

딥링크란? 딥링크는 특정 페이지에 도달할 수 있는 링크를 말한다. 링크란 단어는 실생활에서도 많이 사용되는데, "OO아 내가 링크보냈어 확인해봐~~~", 링크보냈어에서 링크가 딥링크이다. 이 딥링크는 단순히 웹 브라우저 상에서만 존재하는 수단이 아니다. 이런 딥링크를 이용해 특정 앱의 특정 컨텐츠를 상대방에게 편리하게 전달할 수 있다. 커스텀 URL 스킴(URL Scheme)이란? URL Scheme는 URL에서 특정 리소스를 지정하고 접근하는 방식을 정의하는 부분입니다. URL Scheme은 URL의 가장 앞부분에 위치하며, 콜론(':')으로 끝납니다. 주로 네트워크 프로토콜을 나타내며, 브라우저나 애플리케이션이 리소스를 처리하는 방법을 결정하는데 사용된다. 일반적인 URL Scheme 1. HTTP:// 'http://' 웹 페이지를 전송하는 일반적인 프로토콜. 2. HTTPS:// 'https://' 보안 웹 페이지 전송 프로토콜. 3. FTP: 'ftp://' 파일 전송 프로

Naver Blog

SpringBoot Gmail SMTP 메일보내기

Smtp properties 설정 spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username=[gmail 계정] spring.mail.password=[gmail 비밀번호] spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true 메일 전송 소스코드 to : 메일을 받을 주소 subject : 메일 제목 text : 메일 내용 import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; @Component public class EmailServiceImpl implements EmailService { @Autowired public JavaMailSender em

Naver Blog

Controller

@Controller public class HomeController { private static final Logget Logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping(value = "/home", method = RequestMethod.GET) public String home(Locale locale, Model model) { Logger.info("Welcome {}.", locale); // Business Logic Date date = new Date(); DateFormat = dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); // BL의 결과를 Model에 저장 model.addAttribut

Naver Blog

DAO,DTO,Entity Class의 차이

DAO(Data Access Object) 란? repository package 실제로 DB에 접근하는 객체이다. Persistence Layer(DB에 data를 CRUD하는 계층)이다. Service와 DB를 연결하는 고리의 역할을 한다. SQL을 사용하여 DB에 접근한 후 적절한 CRUD API를 제공한다. JPA 대부분의 기본적인 CRUD method를 제공하고 있다. extends JpaRepository<User,Long> public interface QuestionRepository extends CrudRepository<Question, Long> { } DTO(Data Transfer Object) 란? dto package 계층관 데이터 교환을 위한 객체(Java Beans)이다. DB에서 데이터를 얻어 Service나 Controller등으로 보낼때 사용하는 객체를 말한다. 즉, DB의 데이터가 Presentation Logic Tier로 넘어오게 될 떄는

Naver Blog

Spring MVC WebForm

Request Paramter 의 종류 Request Paramter는 HTTP Request Message 안에 담겨서 보내진다. Request Parameter는 2가지 방식으로 전달된다. 1. GET방식 : Query String - url 뒤에 query string 형식으로 붙어서 보내진다. - 조회와 같이 DB를 변경하지 않는 작업에 이 방식을 사용한다. 2. POST 방식 : HTTP Entity Body - HTTP Request Message의 Body에 담겨서 보내진다. - 암호화, 회원가입(Password) 등 주로 DB를 변경하는 작업에 이 방식을 사용한다. Data Binding request parameters가 form bean에 바인딩되는 것을 말한다. 1. @RequestParam 어노테이션 @RequestParam 어노테이션 이용 method 인자에 request parameter을 binding 해준다. 반드시 query string의 key 이름이

Naver Blog

Python Slicing 문자열 자르기

Python Slicing이란? slicing, slice : 연속적인 객체들에 범위를 지정하여 선택된 객체들을 가져온는 방식이다. a 라는 연속적인 객체들의 자료구조(ex: list, tuple, String)가 있다고 가정을 했을 때 기본 형태는 아래와 같습니다. a[start:end:step] start : 슬라이싱을 시작할 시작위치입니다. end : 슬라이싱을 끝낼 위치로 end는 포함되지 않는다. step : 보폭이라고 하며 몇개씩 끊어서 가져올지와 방향을 정한다. 필수사항은 아니며 옵션이다. a[start:] a = ['a','b','c','d','e'] a[1:] ['b','c','d','e'] a[-3:] ['c','d','e'] a[:end] a = ['a','b','c','d','e'] a[:2] ['a','b'] a[:-1] ['a','b','c','d'] a[start:end] a = ['a','b','c','d','e'] a[2:4] ['c','d'] a[-4

Naver Blog

DTO의 필요성

1. DTO를 사용하지 않을 경우 엔티티의 변경에 의해 API 스펙이 변경이 될수가 있다. 엔티티와 API가 일대일 대응의 관계를 가진다면 엔티티에 수정이 일어날 때마다 API 스펙을 일일히 변경해줘야 한다. 또한 컴파일 에러로 이를 감지할 수 없기 때문에 에러 원인을 찾기가 어렵다. (DTO을 사용한다면 엔티티 과정에서 컴파일 에러가 발생되므로 엔티티의 변경사항을 반드시 파악할수 있다. DTO을 사용하지 않음. DTO을 사용함 DTO 생성 entity username으로 수정 requset.getName() -> requset.getUsername() 으로 수정 2. 하나의 엔티티에 대해서 여러개의 API가 존재 할수 있다. 각각의 API가 요구하는 엔티티에 모든정보를 넘겨준다면 필요없는 데이터까지 받긴 하지만 필요한것은 받았기 때문에 기능동작에는 문제가 없다. 하지만 패스워드같은 JSON 으로 함께 넘어가기 때문에 보안문제가 발생할 수 있다.

Naver Blog

@PathVariable

@PathVariable 파라메터을 사용하면 아래와 같이 URL의 일부를 변수로 전달할수 있다. user/10 으로 접근한다면 age 메서드을 호출하고, user/홍길동 으로 접근한다면 name 메서드을 호출한다.

Naver Blog

Java8 Stream (map,filter,sorted) 사용법

기존에 자바 컬렉션이나 배열의 원소를 가공할때 for문, foreach 등으로 원소을 하나씩 뽑아 가공을 하였다면, Stream 을 이용해 깔끔하게 처리가 가능. map 은 요소들을 특정조건에 해당하는 값으로 변환해 줍니다. ArrayList<string> list = new ArrayList<>(Arrays.asList("Apple","Banana","Melon","Grape","Strawberry")) list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()); // APPLE,BANANA,MELON,GRAPE,STRAWBERRY filter 은 요소들을 조건에 따라 걸러내는 작업을 해준다 list.stream().filter(t->t.length()>5).collect(Collectors.toList()) // Banana, Strawberry sorted 은 요소들을 정렬해주는 작업을 해준다. list.strea

Naver Blog

REST API 란?

Rest의 정의 Representational State Transfer 의 약자 이다 자원의 표현에 의한 상태전달이다 REST는 기본적으로 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할수 있는 아키텍처 스타일이다 REST 구성 요소 1. 자원(Resource) URL 모든 자원에 고유한 ID가 존재한다. ID는 '/classes/:class_id' 같은 HTTP URL 이다. 2. 행위 (Verb) HTTP Method HTTP 프로토콜의 Method를 사용한다. HTTP 프로토콜은 GET,POST,PUT,DELETE 같은 메서드을 제공한다. 3. 표현 (Representations) REST에서 하나의 자원은 JSON,XML, TEXT 등 여러형태의 표현으로 나타내어진다. JSON, XML을 통해 데이터을 주고 받는것이 일반적이다. REST API 설계 규칙 1. URL의 리소스명은 동사보다는 명사을 사용 - GET/members/1 2. URL

Naver Blog

linux 명령어 pwd, ls, cd, su

pwd : 현재 디렉토리 경로을 알려준다. ls : 현재 위치에 있는 내용을 알려준다. DOS의 dir 명령과 비슷하다. cd : 디렉토리를 변경 cd / : root 디렉토리로 이동 cd ../ : 현재 디렉토리에서 바로 전 디렉토리로 이동 su : root 사용자로 변경한다. su username : 다른 유저로 변경한다.

Naver Blog

mkdir,rmkdir,chmod

mkdir : 디렉토리 생성 mkdir [옵션] [생성할 디렉토리 이름] 옵션 mkdir -m 777 hello hello 디렉토리을 생성하면서 user,group,other 모두 읽기 쓰기, 실행이 가능하다. chmod 옵션 (reference) (operator) (modes) 파일 reference(대상): u : user (파일을 소유한 사용자) g : group (특정그룹 group에 소속된 사용자 ) o : other (user,group 의 멤버가 아닌 사용자) a : all (위의 셋을 포함하는 모든 사용자의 권한) operator : + : 해당권한을 추가한다. - : 해당 권한을 제거한다. = : 해당권한을 설정한대로 변경한다. modes : r : read (읽기) w : write (쓰기) x : excute (실행) 예제 : chmod ug+rw sample : sample 파일의 user나 group 멤버들에게 읽기, 쓰기, 권한을 추가 chmod u

Naver Blog

vi/vim 단축기 정리

명령어 모드에서 입력모드로 전환 명령어 기능 a 커서 뒤(오른쪽)에 입력 A 행 마지막 부분에 입력 i 커서 앞(왼쪽)에 입력 I 행 처음 부분에 입력 o(소문자) 커서 밑에 빈 행을 추가하여 입력 O(대문자) 커서 위에 빈 행을 추가하여 입력 s 커서에 있는 글자를 지우고 입력 입력 모드에서 명령어 모드로 전환 ESC 키를 누른다. 저장,종료하기 명령어 기능 :q 종료한다. :q! 저장하지 않고 그냥 강제로 종료한다. :w 저장한다. :wq 저장하고 종료한다. zz 저장하고 종료한다(:wq와 동일) :wq 파일 이름 저장할때 파일이름을 지정할수 있다. 되돌리기,다시 실행 명령어 기능 u 이전으로 되돌리기(Undo) Ctrl + r 되돌리기한 것을 다시 실행하기(Redo)

Naver Blog

CascadeType

Cascading이란? - Entity 관계는 종종 다른 Entity 존재에 의존한다. ex) Person - Address 관계이다. Person이 없다면, Address Entity는 존재의미가 없다. 우리가 사람 엔티티을 삭제할때 주소 엔티티 도 같이 삭제된다. Cascading이란 이를 달성하는 방법이다. 대상 엔티티에 대해 일부 작업을 수행하면 연결된 엔티티에 동일한 작업이 적용된다. CascadeType.ALL -모든 Cascade에 적용 @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) private List<Address> addresses; @Entity public class Address { @Id

Naver Blog

Spring Security UserDetails, UserDeatilsService란?

1.UserDetails Spring Security에서 사용자의 정보를 담는 인터페이스는 UserDetails 인터페이스이다. 우리가 이 인터페이스를 구현하게 되면 Spring Security에서 구현한 클래스를 사용자 정보로 인식하고 인증 정보로 인식하고 인증 작업을 한다. 메소드 리턴타입 설명 기본값 getAuthorities() Collection<? extends GrantedAuthority> 계정의 권한 목록을 리턴 getPassword() String 계정의 비밀번호를 리턴 getUsername() String 계정의 고유한 값을 리턴 ( ex : DB PK값, 중복이 없는 이메일 값 ) isAccountNonExpired() boolean 계정의 만료 여부 리턴 true ( 만료 안됨 ) isAccountNonLocked() boolean 계정의 잠김 여부 리턴 true ( 잠기지 않음 ) isCredentialsNonExpired() boolean 비밀번호 만료 여

Naver Blog

세션과 쿠키의 차이

쿠키(cookie) - 사용자가 어떠한 웹사이트을 방문할 경우, 서버에서 사용자의 컴퓨터에 저장하는 작은 기록정보 파일이다. - 필요시 정보를 참조하거나 재사용할수 있다. 세션(Session) - 일정시간동안 사용자가 웹브라우저에를 통해 웹서버에 접속한 시점으로부터 웹브라우저을 종료하여 연결을 끝내는 시점 - 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라고 한다. - 각 클라이언트마다 고유한 Session ID을 부여한다. Session ID 로 클라이언트 구분이 가능하다. - Session DB에 모든 session ID 값을 저장한다.

Naver Blog

1764번 듣보잡

1764번: 듣보잡 1764번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 강의 듣보잡 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 256 MB 37968 15715 11600 40.050% 문제 김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. ... www.acmicpc.net n,m = map(int,input().split()) a = [] b = [] ans = [] for _ in range(n): a.append(input()) for _ in range(m): b.append(input()) ans = sorted(list(set(a) & set(b))) print

Naver Blog

Python set()

집합 set()은 순서 X, 중복 X, 추가 O, 제거 O 인 특징이 있습니다. 집합의 연산 - 집합이라는 개념에 맞게, 합집합,교집합, 차집합이 가능하다. 1. 교집합 a = set([1,2,3,4]) b = set([3,4,5,6]) print(a.intersection(b)) // {3,4} print(a & b) // {3,4} 2. 합집합 a = set([1,2,3,4]) b = set([3,4,5,6]) print(a.union(b)) // {1,2,3,4,5,6} print(a | b) // {1,2,3,4,5,6} 3. 차집합 a = set([1,2,3,4]) b = set([3,4,5,6]) print(a.difference(b)) // {1,2} print(a - b) // {1,2} - 플러스나, 곱하기, 연산자는 사용이 안됨 ... 원소의 추가 - 추가는 집합이름.add(원소) 이다. // list는 append()와 차이를 가진다. a = set([1,2,3,

1 2