eucis의 등록된 링크

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

Naver Blog

프로그래머스 <디스크 컨트롤러> JAVA

* 프로그래머스 디스크 컨트롤러 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를들어 - 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청 와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다. 한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다. - A: 3ms ... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public int solution(int[][] jobs) { int n = jobs.length; LinkedList<int[]> programs = new

Naver Blog

프로그래머스 &lt;가장 큰 수&gt; JAVA

* 프로그래머스 가장 큰 수 코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numb... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public String solution(int[] numbers) { int n = numbers.length; String[] str = new String[n];

Naver Blog

DB & DBMS & SQL

데이터베이스(Database) 데이터베이스는 관련성이 있는 데이터의 집합입니다. 이 데이터는 구조화되어 있어서 쉽게 접근, 관리, 업데이트할 수 있습니다. 예를 들어, 학교의 데이터베이스는 학생, 강의, 교수에 대한 정보를 저장할 수 있습니다. 전자적으로(electronically) 저장되고 사용되는 관련있는(related) 데이터들의 조직화된 집합(organized collection) DBMS(Database Management Systems) 데이터베이스는 많은 데이터가 모여 있는 '데이터의 집합'으로 정의할 수 있습니다. 이러한 데이터베이스를 효율적으로 관리하고 운영하는 소프트웨어가 바로 DBMS(데이터베이스 관리 시스템)입니다. DBMS의 핵심 기능 중 하나는 데이터베이스를 여러 사용자나 응용 프로그램이 공유하고 동시에 접근할 수 있게 하는 것입니다. 예를 들어, 은행의 예금 계좌 정보를 저장하는 데이터베이스를 생각해 볼 수 있습니다. 이 데이터베이스에는 수많은 고객들의 예

Naver Blog

이상 현상(Anomaly) & ERD와 정규화 과정

이상 현상(Anomaly) 관계형 데이터베이스 설계에서 정보의 이상 현상을 방지하는 것은 중요합니다. 이상 현상은 데이터를 삽입, 수정, 삭제할 때 논리적 오류가 생기는 것을 말하며, 주로 갱신 이상, 삽입 이상, 삭제 이상으로 구분됩니다. 학번 이름 나이 성별 강의코드 강의명 전화번호 1011 이태호 23 남 AC1 데이터베이스 개론 010-2627-8123 1012 강민정 20 여 AC2 운영체제 010-4665-1941 1013 김현수 21 남 AC3 자료구조 010-5223-4464 1013 김현수 21 남 AC4 웹 프로그래밍 010-5223-4464 1014 이병철 26 남 AC5 알고리즘 010-6305-2912 1. 삽입 이상 : 자료를 삽입할 때 의도하지 않은 자료까지 삽입해야만 자료를 테이블에 추가가 가능한 현상 강의를 아직 수강하지 않은 새로운 학생을 삽입할 경우 강의 코드와 강의명 속성에는 null값이 들어가야 하는 문제가 생깁니다. 2. 갱신 이상 : 중복된

Naver Blog

프로그래머스 &lt;소수 찾기&gt; JAVA

* 프로그래머스 소수 찾기 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다. 입출력 예 numbers return "1... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public int solution(String numbers) { Set<Integer> permutation = new HashSet<>(); permutation("

Naver Blog

프로그래머스 &lt;전화번호 목록&gt; JAVA

* 프로그래머스 전화번호 목록 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_b... school.programmers.co.kr 문제의 요지를 파악하자면 phone_book이라는 배열이 들어왔을 때, 어떠한 값이 다른 값의 접두어가 되면 False를 반환하고 그렇지 않으면 True를 반환하는 문제이다. 문제의 특징은 전화번호이지만 String[] 타입으로 인자가 주어졌

Naver Blog

프로그래머스 &lt;의상&gt; JAVA

* 프로그래머스 의상 코딩테스트 연습 - 의상 코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다. 예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다. 종류 이름 얼굴 동그란 안경, 검정 선글라스 상의 파란색 티셔츠 하의 청바지 겉옷 긴 코트 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다. 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹... school.programmers.co.kr clothes의 2차원 배열이 들어왔을때(의상의 이름, 의상의 종류), 가능한 의상의 조합의 수를 구하는 문제이다. 처음 문제를 보았을 때, 본능적으로 HashMap을 활용하여 문제를 풀어야겠다는 생각을 했지만 재귀로 구하는 조합의 수와 어떻게 알고리즘을 섞어

Naver Blog

인프런 &lt;좌석 번호&gt; JAVA

* 인프런 좌석번호 세계 최고의 알고리즘 전문가인 현수의 강연을 보기위해 많은 사람들이 찾아왔습니다. 강연장에는 가로로 c개, 세로로 r개의 좌석이 c×r격자형태로 배치되어 있다. 각 좌석의 번호는 해당 격자의 좌표 (x,y)로 표시된다. 아래 그림은 가로 6개, 세로 5개 좌석으로 구성된 6×5격자형 좌석배치입니다. 각 격자에 표시 된 (x,y)는 해당 좌석의 번호를 말합니다. 가장 왼쪽 아래의 좌석번호는 (1,1)이며, 가장 오른 쪽 위 좌석의 번호는 (6, 5)이다. (1, 5) (2, 5) (3, 5) (4, 5) (5, 5) (6, 5) (1, 4) (2, 4) (3, 4) (6, 4) (1, 3) (2, 3) (6, 3) (1, 2) (2, 2) (6, 2) (1, 1) (2, 1) (3, 1) (4, 1) (5, 1) (6, 1) 사람들은 온 순서대로 (1,1)위치 좌석부터 시작하여 시계방향으로 돌아 들어가면서 빈 좌석에 앉습니다. 만약 5번째로 온 사람은 (1, 5)좌

Naver Blog

인프런 &lt;최대길이 바이토닉 수열&gt; JAVA

* 인프런 최대길이 바이토닉 수열 바이토닉 수열이란 수열이 증가했다가 감소하는 수열을 의미합니다. 예를 들어 1, 2, 3, 2, 1과 같이 증가했다가 감소하면 바이토닉 수열이라고 합니다. 하지만 1, 2, 3, 4, 5와 같이 증가만 하거나, 5, 4, 3, 2, 1처럼 감소만 하면 바이토닉 수열이라 하지 않습니다. 또 1, 2, 2, 3, 2, 1처럼 같은 값이 이웃해도 바이토닉 수열이라 하지 않습니다. 매개변수 nums에 길이가 n인 수열이 주어지면 이 수열의 연속부분수열 중 가장 긴 바이토닉 수열을 찾아 그 길이를 반환하는 프로그램을 작성하세요. 만약 [1, 3, 2, 5, 7, 4, 2, 5, 1]수열이 주어지면 이 수열의 연속부분수열 중 가장 긴 바이토 닉 수열은 [2, 5, 7, 4, 2]이고, 답은 5입니다. 제한사항: • nums의 길이 3 <= n <= 10,000 • 배열 nums의 원소는 자연수입니다. * 문제풀이 import java.util.*; class

Naver Blog

Firebase Service Key JSON 파일 SECRET 배포 (Github Actions + Create-JSON)

서버 배포 환경에서 REPO를 PUBLIC으로 전환하기 위해 설정 파일들을 SECRET으로 돌려야 하는 작업을 진행해야 했다. YML 파일 같은 경우 SECRET을 통해 Base64로 인코딩한 이후에 Github Actions에서 Set YML을 통해 YML 파일을 설정해었다. 그러나, JSON 파일의 경우 YML 파일과 마찬가지로 Base64를 통해 인코딩 한 이후 Decode 하도록 Github Actions를 설정해주니 JSON 파일이 생성되지 않는 문제가 발생하였다. JSON 파일의 경우 Github Actions의 Create-JSON을 활용하여 설정 파일을 만들어주어야 했다. create-json - GitHub Marketplace Create an JSON file from secret or a string of a json github.com GitHub Actions에서 jsdaniell/[email protected] 액션을 사용하여 JSON 파일을 생성하는 방

Naver Blog

프로그래머스 &lt;베스트앨범&gt; JAVA

* 프로그래머스 베스트앨범 코딩테스트 연습 - 베스트앨범 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return... school.programmers.co.kr 이 프로그램은 스트리밍 사이트에서 장르별로 가장 많이 재생된 노래를 두 개씩 선정해 베스트 앨범을 구성하는 것을 목표로 합니다. 각 노래는 고유 번호로 구분되며, 선정 기준은 다음과 같습니다: 가장 많이 재생된 장르를 우선적으로 선택합니다. 장르 내

Naver Blog

프로그래머스 &lt;주식가격&gt; JAVA

* 프로그래머스 주식가격 코딩테스트 연습 - 주식가격 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다. 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다. 3초 시점... school.programmers.co.kr 이 문제는 주식의 가격이 초 단위로 기록된 배열 prices를 주어지며, 각 시점에서 주식 가격이 떨어지지 않은 기간을 초 단위로 계산하는 것입니다. 배열의 각 원소는 특정 시점에서의 주식 가격을 나타내며, 이 가격이 얼마나 오랫동안 떨어지지 않았는지를

Naver Blog

인프런 &lt;과일 가져가기&gt; JAVA

* 인프런 과일 가져가기 현수네 반에는 1번부터 n번까지 학생번호를 가진 n명의 학생이 있습니다. 모든 학생의 책상에는 사과, 배, 귤이 담긴 A, B, C 세 바구니가 놓여 있습니다. A바구니는 사과만 담고, B바구니는 배만 담고, C바구니는 귤만 담습니다. 각 학생은 책상에 있는 세 바구니 중 하나를 가질 수 있습니다. 단 이 세 바구니 중 가장 적게 과일이 담겨있는 바구니를 가집니다. 예를 들어 현수의 책상에 14, 17, 14개가 각각 바구니에 담겨 있다면 현수는 사과(14개) 또는 귤(14개) 중 하나를 가져갑니다. 즉 현수는 14개의 과일을 가져가는 것입니다. 모든 학생은 딱 한 번 바구니의 과일 한 개를 다른 학생과 교환할 수 있는 기회가 있습니다. 교환하는 규칙은 다음과 같습니다. 1) 1번 학생부터 번호 순으로 교환을 할 건지 결정합니다. 2) 교환을 하는 양쪽 학생이 서로 이득이 되면 무조건 교환을 합니다. 즉 양쪽이 모두 가져가 는 과일의 개수가 원래 가져가려고

Naver Blog

Softeer &lt;수퍼바이러스&gt; JAVA

* Softeer 수퍼바이러스 Softeer - 현대자동차그룹 SW인재확보플랫폼 수퍼바이러스 난이도 Lv. 3 제출 2,045 명 참가자 452 명 정답률 19.60 % 지원 언어 JavaScript C C++ Java Python C# Kotlin Go Swift 문제 풀이하기 로그인 후 문제풀이가 가능합니다. 문제설명 제출 이력 연습문제 톡 언어별 시간/메모리 언어 시간 메모리 JavaScript 2초 256MB C 1초 256MB C++ 1초 256MB Java 2초 256MB Python 2초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB 수... softeer.ai 이 문제는 수퍼바이러스의 지수적 성장을 계산하는 것에 관한 것입니다. 수퍼바이러스는 초당 P배의 비율로 증가하며, 이 증가율은 0.1초마다 적용됩니다. 즉, N초 동안 수퍼바이러스의 개수는 매 0.1초마다 P배씩 증가한다는 것을 의미합니다. 따라서 N

Naver Blog

국회 공공데이터 활용 경진대회

국회 공공데이터 활용 경진대회 웹앱 프로젝트 개발 국회 공공데이터 활용 경진대회는 열린국회정보 Open API를 활용한 ICT 경진대회이다. 우리는 우리 지역의 국회의원이 누구인지 어떤 이력을 가지고 당선 이후 어떤 행보를 가지고 있는지 찾기 힘들다. 이 점을 공략하여 국회 공공데이터 활용 경진대회 방향성을 잡았다. 먼저, 역대 국회의원의 인적사항 API를 통해 지역구의 국회의원이 누구인지에 대한 정보와 인적사항을 확인할 수 있게 Main 화면을 구성할 예정이다. 이후, 국회의원의 공약집을 통해 Cloud Vision API를 활용하여 키워드를 추출하고 국회의원 SNS API를 활용해 현재 국회의원의 활동 중 공약과 관련된 활동을 확인할 수 있도록 가닥을 잡았다. 사용할 국회 Open API 데이터는 아래와 같다. 1.국회의원 인적사항 https://open.assembly.go.kr/portal/data/service/selectAPIServicePage.do/OWSSC600113

Naver Blog

국회의원 SNS 정보 OpenAPI

국회의원의 공약집을 확인하고 키워드 추출을 통해 SNS에서 공약과 관련되어 무슨 활동을 하고 있는지 확인하기 위해 열린국회정보 Open API에서 국회의원 SNS 정보 API를 활용하기로 하였다. 먼저 API의 메타 정보를 확인하면 아래와 같은데 다른 공공데이터를 볼 때 항상 최종 수정일자가 너무 옛날이라 데이터의 활용가치가 없다고 생각했었다. 그러나 이거는 매일매일 수정되는것 같으니 지속적으로 활용하기에도 좋은 데이터라 이용해볼 가치가 있다. 먼저 API의 구성을 보면 아래와 같은데 기본인자 값만 넘겨주고 이름, 국회의원코드 같은 요청인자는 넘겨주지 않고 전부 받아올 생각이다. Service 계층에서의 기본적으로 JSON 값을 가져오는 코드는 아래와 같다. Constant 변수로 하드코딩을 진행하지 않고 상수값들을 전부 분리해주었다. @Service @Transactional public class CongressService { public String requestData()

Naver Blog

국회의원 인적사항 Open API

국회의원 SNS 정보 API에 이어 국회의원 인적사항 API를 이용하였다. 국회의원 인적사항 열린국회정보 Open API의 경우 국회의원별 소속정당, 위원회, 재선여부, 당선대수 등 인적정보를 제공한다. 이 API 또한 최종 수정 날짜가 2023-11-28일자로 나중에 서비스를 확장해 나가기 좋을 것 같아 이 API를 선정하였다. SNS 정보 API와 마찬가지로 필수 정보만 Request로 보내 국회의원의 정보를 가져오도록 하였다. 또한, SNS 정보 데이터 관리 방법과 마찬가지로 데이터베이스에 매일 저녁 6시마다 업데이트 하도록 코드를 구현하였다. 기본적인 로직은 SNS Service와 틀이 똑같다. CongressPersonalInfo Entity를 아래와 같이 구성했다. 다만 String으로 MEM_TITLE을 설정하니까 길이가 너무 길어 DB에 저장할 수가 없었다. 이를 해결하기 위해 ColumnDefinition을 TEXT로 변경하였다. MySQL에서 TEXT 타입은 큰 문

Naver Blog

국회의원 공약 API

국회의원의 공약을 모아놓은 Open API를 종일 찾았는데 존재하지 않았다. 중앙선거관리위원회에서 하는 정책 공약마당에서 당선인 공약을 확인할 수 있었는데 국회의원들의 공약이 PDF 파일로 존재했다. 국회의원의 공약집 중에서 공약이 쓰여 있는 부분만 PNG 파일로 만들어 S3에 저장해서 클라이언트에서 지역을 입력 받으면 S3 버킷에서 저장한 공약집 사진을 반환하도록 구현하였다. 먼저 기본적인 DB 구축을 위해 CongressPromise Entity를 아래와 같이 구현하였다. @Entity @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class CongressPromise { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator( name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) @Colum

Naver Blog

친구 그룹(FriendGroup) API 리팩토링

친구 그룹은 사용자가 친구 목록 중 선택하여 그룹을 만들 수 있는 서비스 기능이다. 그룹의 정보만을 담고 있어 Member와 1:N 연관관계 매핑이 되어있다. (이 때 외래키는 owner로 그룹을 만든 장본인이다.) 그룹에 들어 있는 Member 목록 같은 경우는 FriendGroupMember Entity에서 따로 관리하도록 설계하였다. 그룹 생성 API 리팩토링 /** * Create group response create group. * * @param requestCreateGroup the request create group * @return the response create group */ public ResponseCreateGroup createGroup(RequestCreateGroup requestCreateGroup) { Member owner = returnMember(requestCreateGroup.getOwnerId()); validateGroupMem

Naver Blog

Nginx 고용량 이미지 업로드 오류 해결 (SpringBoot + Android Studio + AWS S3 + Elastic Beanstalk)

* 문제 발견 FE와 이미지 업로드 통신을 진행하는 과정에서 413 Request Entity Too Long이라는 오류가 발생하였다. SpringBoot의 YML 파일에서 spring-multipart-max-file-size와 spring-multipart-max-request-size 를 100MB로 설정해주었고 로컬 환경에서는 S3가 문제가 없었지만 Elastic Beanstalk의 배포 환경에서는 이와 같은 오류가 발생하였다. * 원인 파악 원인은 용량이 큰 파일을 업로드하려고 해서이다. nginx로 reverse proxy를 사용할 때 용량이 큰 파일을 업로드하면 에러를 낸다. nginx의 default 값은 1MB이다. * 추가적인 학습 Nginx란 무엇인가? Nginx는 높은 성능과 안정성 그리고 현재 가장 많이 사용되고 있는 웹 서버입니다. Apache 같은 웹 서버와 비교하면 더 가볍고, 대규모 애플리케이션 처리에 적합하다는 장점이 있습니다. 보통 웹 서비스는 클라

Naver Blog

사용자 검색 기록(Search History) API 리팩토링

사용자 검색 기록 기능은 사용자가 일정을 추가할때, 위치 정보를 검색할 수 있다. 이 때 검색한 위치 정보를 저장하는 기능을 구현하는 클래스가 사용자 검색 기록(Search History) 클래스이다. 사용자 검색 기록 저장 API 리팩토링 사용자 검색 기록 API의 경우는 간단하다. Member로부터 searchHistory를 받고 저장한다. 당연히 Member는 여러 검색기록이 존재할 수 있으므로 ManyToOne으로 연관관계 매핑을 해주었다. 아래는 기존의 사용자 검색 기록 저장 API 로직이다. /** * Set search history. * * @param requestSearchHistory the request search history */ public ResponseSaveSearchHistory setSearchHistory(RequestSearchHistory requestSearchHistory){ Member findMember = memberReposito

Naver Blog

제네릭 기법, Vector, ArrayList

제네릭(generic) 클래스나 메소드를 형판에서 찍어내듯이 생산할 수 있도록 일반화된 형판을 만드는 기법 컬렉션 자바 인터페이스와 클래스 Vector<E> <E>에 사용할 요소의 특정 타입으로 구체화 배열을 가변 크기로 다룰 수 있게 하는 컨테이너 -> 배열의 길이 제한 극복 -> 요소의 개수가 넘치면 자동으로 길이 조절 3. Vector에 삽입 가능한 것 -> 객체, NULL -> 기본 타입의 값은 Wrapper 객체로 만들어 저장 4. Vector에 객체 삽입 -> 벡터의 맨 뒤, 중간에 객체 삽입 가능 5. Vector에서 객체 삭제 -> 임의의 위치에 있는 객체 삭제 가능 Vector<Integer> 벡테 컬렉션 내부 Vector<E> 클래스의 주요 메소드 ArrayList<E> 가변 크기 배열을 구현한 클래스 -> <E>에 요소로 사용할 특정 타입으로 구체화 2. 벡터와 거의 동일 -> 요소 삽입, 삭제, 검색 등 벡터 기능과 거의 동일 -> 벡터와 달리 스레드 동기화 기

Naver Blog

Iterator, HashMap

컬렉션의 순차 검색을 위한 Iterator Iterator <E> 인터페이스 -> 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 인터페이스 2. Iterator 객체 얻어내기 -> 컬렉션의 iterator() 메소드 호출 -> 해당 컬렉션을 순차 검색할 수 있는 Iterator 객체 리턴 HashMap<K, V> 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션 -> K: 키로 사용할 요소의 타입 -> V: 값으로 사용할 요소의 타입 -> 키와 값이 한 쌍으로 삽입 -> '값'을 검색하기 위해서는 반드시 '키' 이용 2. 삽입 및 검색이 빠른 특징 -> 요소 삽입: put() 메소드 -> 요소 검색: get() 메소드 3. 예) HashMap<String, String> 생성, 요소 삽입, 요소 검색 HashMap<String, String>의 내부 구성 HashMap<String, String> map = new HashMap<String, String>()

Naver Blog

웹 서버, 웹 어플리케이션 서버

웹 - HTTP 기반 모든 것이 HTTP - HTTP 메시지에 모든 것을 전송 HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML(API) 거의 모든 형태의 데이터 전송 가능 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용 웹 서버(Web Server) HTTP 기반으로 동작 정적 리소스 제공, 기타 부가기능 정적(파일) HTML, CSS, JS, 이미지, 영상 예) NGINX, APACHE 웹 애플리케이션 서버(WAS - Web Application Server) HTTP 기반으로 동작 웹 서버 기능 포함 + (정적 리소스 제공 가능) 프로그램 코드를 실행해서 애플리케이션 로직 수행 -> 동적 HTML, HTTP API(JSON) -> 서블릿, JSP, 스프링 MVC 예) 톰캣(Tomcat) Jetty, Undertow 웹 시스템 구성 - WAS, DB WAS가 너무 많은 역할을 담당, 서버 과부하 우려 가장 비싼 애플리케이션 로직이 정적 리소스 때문에

Naver Blog

멀티 쓰레드

쓰레드 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행 쓰레드가 없다면 자바 애플리케이션 실행이 불가능 쓰레드는 한번에 하나의 코드 라인만 수행 동시 처리가 필요하면 쓰레드를 추가로 생성 요청마다 쓰레드 생성 장점 -> 동시에 요청을 처리할 수 있다. -> 리소스(CPU, 메모리)가 허용할 때 까지 처리 가능 -> 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다. 2. 단점 -> 쓰레드는 생성 비용이 너무 비싸다. (고객의 요청이 올때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.) -> 쓰레드는 컨텍스트 스위칭 비용이 발생한다. -> 쓰레드 생성에 제한이 없다. (고객 요청이 너무 많으면, CPU/메모리 임계점을 넘어서 서버가 죽을 수 있다.) 쓰레드 풀 - 요청마다 쓰레드 생성의 단점 보완 특징 -> 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다. -> 쓰레드 풀에 생성 가능한 쓰레드의

Naver Blog

HTML, HTTP API, CSR, SSR

정적 리소스 고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공 주로 웹 브라우저 HTML 페이지 동적으로 필요한 HTML 파일을 생성해서 전달 웹 브라우저: HTML 해석 HTTP API HTML이 아니라 데이터를 전달 주로 JSON 형식 사용 다양한 시스템에서 호출 다양한 시스템에서 호출 데이터만 주고 받음, UI 화면이 필요하면 클라이언트가 별도 처리 앱, 웹 클라이언트, 서버 to 서버 다양한 시스템 연동 주로 JSON 형태로 데이터 통신 UI 클라이언트 접점 -> 앱 클라이언트 (아이폰, 안드로이드, PC 앱) -> 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출 -> React, Vue.js 같은 웹 클라이언트 서버 to 서버 -> 주문 서버 to 결제 서버 -> 기업간 데이터 통신 서버사이드 렌더링, 클라이언트 사이드 렌더링 SSR - 서버 사이드 렌더링 -> HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달 -> 주로 정적인 화면에 사용

Naver Blog

리스트의 구현, 배열

List 리스트(List)는 일련의 동일한 타입의 항목(item)들 실생활의 예: 학생명단, 시험 성적, 서점의 신간 서적, 상점의 판매 품목, 실시간 급상승 검색어등 리스트의 구현 -> 1차원 배열 -> 단순연결리스트 -> 이중연결리스트 -> 원형연결리스트 배열 배열(Array)은 동일한 타입의 원소들이 연속적인 메모리 공간에 할당되어 각 항목이 하나의 원소엥 저장되는 기본적인 자료구조이다. 특정 원소에 접근할 때에는 배열의 인덱스를 이용하여 O(1) 시간에 접근할 수 있다. 새 항목이 배열 중간에 삽입되거나 중간에 있는 항목을 삭제하면, 뒤 따르는 항목들을 한 칸씩 뒤로 또는 앞으로 이동시켜야 하므로 삽입이나 삭제 연산은 항상 O(1) 시간에 수행할 수 없다. Overflow 배열은 미리 정해진 크기의 메모리 공간을 할당 받은 뒤 사용해야 하므로, 빈자리가 없어 새 항목을 삽입할 수 없는 상황(overflow) 발생 Overflow가 발생하면 에러 처리를 하여 프로그램을 정지시키

Naver Blog

01. Spring Data JPA

1. 쇼핑몰 프로젝트 생성하기 Thymeleaf: 서버에서 가공한 데이터를 뷰에 보여주기 위한 템플릿 엔진으로 타임리프 의존성을 추가한다. Sping Data JPA: Spring Data JPA는 JPA를 쉽게 구현할 수 있도록 도와주는 모듈입니다. MySQL Driver: 프로젝트에서 사용할 데이터베이스는 MySQL로 의존성을 추가한다. H2 Database: H2 Database는 자바 기반의 관계형 데이터베이스로 매우 가볍고 빠른 데이터베이스입니다. 디스크 기반의 데이터 저장뿐만 아니라 메모리 내에 데이터를 저장하는 인메모리 데이터베이스 기능을 지원합니다. 2. 상품 엔티티 설계하기 엔티티 관련 어노테이션 ※ CLOB과 BLOB의 의미 CLOB이란 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입입니다. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 됩니다. BLOB은 바이너리 데이터를 DB 외부에 저장하기 위한 타입입니다. 이미지, 사운드,

Naver Blog

02. 회원가입, 로그인/로그아웃

1. 스프링 시큐리티 설정하기 스프링 시큐리티를 사용하기 위해 의존성을 추가해줍니다. //Security, LoginValidation implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '2.5.6' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-security-test' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' 이렇게 했을 시 모든 요청에 인증을 필요로 하지만 SecurityConfig.java의 configure 메소드에 설정을 추가하지 않으면 요청에 인증을 요구하지 않습니다. SecurityConf

Naver Blog

03. 페이지 권한 설정하기

ADMIN 계정만 접근할 수 있는 상품 등록 페이지를 생성하고 ItemController 클래스를 작성합니다. ItemController -----------코드 생략----------- @Controller public class ItemController { @GetMapping("/admin/item/new") public String itemForm(){ return "item/itemForm"; } } 인증되지 않은 사용자가 리소스를 요청할 경우 "Unauthorized" 에러를 발생하도록 AuthenticationEntryPoint 인터페이스를 구현합니다. CustomAuthenticationEntryPoint -----------코드 생략----------- public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpSer

Naver Blog

04. 연관 관계 매핑

01. 연관 관계 매핑 종류 일대일(1:1): @OneToOne 일대다(1:N): @OneToMany 다대일(N:1): @ManyToOne 다대다(N:M): @ManyToMany 02. 일대일 단방향 매핑하기 장바구니(Cart) 엔티티를 만들고 회원 엔티티와 연관 관계 매핑을 설정합니다. 장바구니 엔티티가 일방적으로 회원 엔티티를 참조하고 있습니다. 장바구니와 회원은 일대일로 매핑 돼 있으며, 장바구니 엔티티가 회원 엔티티를 참조하는 일대일 단방향 매핑입니다. 애플리케이션을 실행하면 콘솔창에 cart 테이블이 생성되는 쿼리문이 실행되는 것을 볼 수 있습니다. cart 테이블은 member_id 컬럼을 외래키로 갖습니다. 테이블을 먼저 생성하는 쿼리문이 실행되고 member_id를 foreign key로 지정하는 쿼리문이 실행됩니다. 장바구니 엔티티와 회원 엔티티의 매핑을 맺어주면 장바구니 엔티티를 조회하면서 회원 엔티티의 정보도 동시에 가져올 수 있는 장점이 있습니다. CartRep

Naver Blog

05. 영속성 전이

1. 영속성 전이란 영속성전이란 엔티티의 상태를 변경할 때 해당 엔티티와 연관된 엔티티의 상태 변화를 전파시키는 옵션입니다. 이때 부모는 One에 해당하고 자식은 Many에 해당합니다. 예를 들어 Order 엔티티가 삭제되었을 때 해당 엔티티와 관련되어 있는 OrderItem 엔티티를 한꺼번에 저장할 수 있습니다. 영속성 전이 옵션을 무분별하게 사용할 경우 삭제되지 말아야 할 데이터가 삭제될 수 있으므로 조심해서 사용해야 합니다. 영속성 전이 옵션은 단일 엔티티에 완전히 종속적이고 부모 엔티티와 자식 엔티티의 라이프 사이클이 유사할 때 cascade 옵션을 활용합니다. OrderRepository 인터페이스를 생성합니다. OrderRepository -----------코드 생략----------- public interface OrderRepository extends JpaRepository<Order, Long> { } @OneToMany 어노테이션에 cascade 옵션을 설정

Naver Blog

JPA 소개

JPA? 1. Java Persistence API 2. 자바 진영의 ORM 기술 표준 ORM Object-relational mapping(객체 관계 매핑) 객체는 객체대로 설계 관계형 데이터베이스는 관계형 데이터베이스대로 설계 ORM 프레임워크가 중간에서 매핑 대중적인 언어에는 대부분 ORM 기술이 존재 JPA는 애플리케이션과 JDBC 사이에서 동작 JPA 동작 저장 2. 조회 JPA는 표준 명세 JPA는 인터페이스의 모음 JPA 2.1 표준 명세를 구현한 3가지 구현체 하이버네이트, EclipseLink, DataNucleus JPA를 왜 사용해야 하는가? SQL 중심적인 개발에서 객체 중심으로 개발 생산성 유지보수 패러다임의 불일치 해결 성능 데이터 접근 추상화와 벤더 독립성 표준 2-1) 생산성 - JPA와 CRUD 3-1) 유지보수 - 기존: 필드 변경시 모든 SQL 수정 -> JPA: 필드만 추가하면 됨, SQL은 JPA가 처리 JPA와 패러다임의 불일치 해결 JPA와

Naver Blog

User Service API 구현

1. User 도메인 클래스 생성 User -----------코드 생략----------- @Data @AllArgsConstructor @RequiredArgsConstructor public class User { private Integer id; private String name; private Date joinDate; } UserDaoService -----------코드 생략----------- @Service @AllArgsConstructor public class UserDaoService { private static List<User> users = new ArrayList<>(); private static int usersCount = 3; static { users.add(new User(1, "Kenneth", new Date())); users.add(new User(2, "Alice", new Date())); users.add(new User(3

Naver Blog

RESTful Service 기능 확장

1. 유효성 체크를 위한 Validation API 사용 User -----------코드 생략----------- @Size(min = 2, message = "Name은 2글자 이상 입력해 주세요.") private String name; @Past private Date joinDate; User -----------코드 생략----------- @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user){ User savedUser = service.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.created(location).build()

Naver Blog

Microservice와 Spring Cloud의 소개

1. Cloud Native Architecture 확장 가능한 아키텍처 - 시스템의 수평적 확정에 유연 - 확장된 서버로 시스템의 부하 분산, 가용성 보장 - 시스템 또는, 서비스 애플리케이션 단위의 패키지 (컨테이너 기반 패키지) - 모니터링 탄력적 아키텍처 - 서비스 생성 - 통합 - 배포, 비즈니스 환경 변화에 대응 시간 단축 - 분헐할된 서비스 구조 - 무상태 통신 프로토콜 - 서비스의 추가와 삭제 자동으로 감지 - 변경된 서비스 요청에 따라 사용자 요청 처리 (동적 처리) 장애 격리 (Fault isolation) - 특정 서비스에 오류가 발생해도 다른 서비스에 영향 주지 않음 2. Cloud Native Application 지속적인 통합, CI (Continuous Integration) - 통합 서버, 소스 관리 (SCM), 빌드 도구, 테스트 도구 - ex) Jenkins, Team CI, Travis CI 지속적인 배포 - Continuous Delivery -

Naver Blog

06. 상품 등록 및 수정

1. 상품 등록하기 상품의 이미지를 저장하는 상품 이미지 엔티티를 만듭니다. 상품 이미지 엔티티는 이미지 파일명, 원본 이미지 파일명, 이미지 조회 경로, 애표 이미지 여부를 갖도록 설계합니다. ItemImg -----------코드 생략----------- @Entity @Table(name = "item_img") @Getter @Setter public class ItemImg extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "item_img_id") private Long id; private String imgName; private String oriImgName; private String imgUrl; private String repimgYn; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") p

Naver Blog

단순연결리스트로 구현한 리스트

1. 단순연결리스트 단순연결리스트(Singly Linked List)는 동적 메모리 할당을 이용해 리스트를 구현하는 가장 간단한 형태의 자료구조 동적 메모리 할당을 받아 노드(node)를 저장하고, 노드는 레퍼런스를 이용해 다음 노드를 가리키도록 만들어 노드들을 한 줄로 연결시킴 연결리스트에서는 삽입이나 삭제 시 항목들의 이동이 필요 없음 배열의 경우 최초에 배열의 크기를 예측하여 결정해야 하므로 대부분의 경우 배열에 빈 공간ㅇ르 가지고 있으나, 연결리스트는 빈 공간이 존재하지 않음 연결리스트에서는 항목을 탐색하려면 항상 첫 노드부터 원하는 노드를 찾을 때까지 차례로 방문하는 순차탐색 (Sequential Search)을 해야 함 2. 단순연결리스트의 노드를 위한 Node 클래스 Node 객체는 항목을 저장할 item과 Node 레퍼런스를 저장하는 next를 가짐 3. 리스트를 단순연결리스트로 구현한 SList 클래스 SList 생성자는 연결리스트의 첫 노드를 가리키는 head를 n

Naver Blog

이중연결리스트

1. 이중연결리스트 이중연결리스트(Doubly Linked List)는 각 노드가 두 개의 레퍼런스를 가지고 각각 이전 노드와 다음 노드를 가리키는 연결리스트 단순연결리스트는 삽입이나 삭제할 때 반드시 이전 노드를 가리키는 레퍼런스를 추가로 알아내야 하고, 역방향으로 노드들을 탐색할 수 없음 이중연결리스트는 단순연결리스트의 이러한 단점을 보완하나, 각 노드마다 추가로 한 개의 레퍼런스를 추가로 저장해야 한다는 단점을 가짐 2. 이중연결리스트의 노드를 위한 DNode 클래스 3. 이중연결리스트를 위한 DList 클래스 head, tail, size를 가지는 DList 객체로, 생성자에서 head에 연결리스트의 첫 노드를 가리키는 레퍼런스를 저장 tail: 연결리스트의 마지막 노드를 가리키는 레퍼런스를 저장 head와 tail이 가리키는 노드는 생성자에서 아래와 같이 초기화. 이 두 노드들은 실제로 항목을 저장하지 않는 Dummy 노드 insertBefore()메소드: 새 노드를 인자로

Naver Blog

07. 상품관리하기

1. 상품 관리하기 상품 관리 화면에서는 상품을 조회하는 조건을 설정 후 페이징 기능을 통해 일정 개수의 상품만 불러오며, 선택한 상품 상세 페이지로 이동할 수 있는 기능까지 구현해봅니다. 조회 조건으로 설정할 값은 다음과 같습니다. 상품 등록일 상품 판매 상태 상품명 또는 상품 등록자 아이디 이때 쿼리를 동적으로 쉽게 생성하고 비슷한 쿼리를 재활용하기 위해 Querydsl을 사용합니다. Querydsl을 사용하기 위해 build.gradle의 dependency와 plugin을 수정합니다. buildscript { ext { queryDslVersion = "5.0.0" } } // QueryDSL 설정 start def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } c

Naver Blog

원형연결리스트

1. 원형연결리스트 원형연결리스트 (Circular Lilnked List)는 마지막 노드가 첫 노드와 연결된 단순연결리스트 원형연결리스트에서는 마지막 노드의 레퍼런스가 저장된 last가 단순연결리스트의 head와 같은 역할 마지막 노드와 첫 노드를 O(1) 시간에 방문할 수 있는 장점 리스트가 empty가 아니면 어떤 노드도 null 레퍼런스를 가지고 있지 않으므로 프로그램에서 null 조건을 검사하지 않아도 되는 장점 원형연결리스트에서는 반대 방향으로 노드들을 방문하기 쉽지 않으며, 무한 루프가 발생할 수 있음에 유의할 필요 [원형연결리스트의 응용] 여러 사람이 차례로 돌아가며 하는 게임을 구현하는데 적합한 자료구조 많은 사용자들이 동시에 사용하는 컴퓨터에서 CPU 시간을 분할하여 작업들에 할당하는 운영체제에 사용 이항힙(Binomial Heap)이나 피보나치힙(Fibonacci Heap)과 같은 우선순위큐를 구현하는 데에도 원형연결리스트가 부분적으로 사용 2. 원형연결리스트를

Naver Blog

트랜잭션

트랜잭션이란 쪼갤 수 없는 업무의 최소 단위 쇼핑몰 사이트에서 물건을 주문한다면 1) 주문 기록을 저장하고 2) 포인트를 저장하고 3) 결제 기록을 저장해야 한다 그런데 만약 중간에서 에러가 난다면 예컨데 주문기록과 포인트는 있는데, 결제 기록이 없는 상황이 생길 수도 있다. 이러한 문제를 해결하기 위해 나온 해답은 모든 SQL을 성공시키거나, 하나라도 실패하면 모두 실패하는걸로 만드는 것이다. 트랜잭션 시작하기: start transaction; 트랜잭션 정상 종료하기 (SQL 반영): commit; 트랜잭션 실패 처리하기 (SQL 비반영): rollback; 결국 묶어서 저장된다는 의미이다. Client1이 DB에 유저 A를 저장한다고 했을때 트랜잭션이 시작된다. 저장하고 있는 코드가 진행되고 있을 때 Client2가 전체 유저 조회를 하지만 아직 Client1이 유저 A를 저장한다는 SQL이 반영되지 않았고 Client2는 A 유저를 확인할 수 없다. 결국 코드를 작성할 때 S

Naver Blog

영속성 컨텍스트

영속성 컨텍스트란 테이블과 배핑된 Entity 객체를 관리/보관하는 역할 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료 영속성 컨텍스트의 특수 능력 변경 감지 (Dirty Check) - 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않아도, 변경을 감지해 자동으로 저장된다. 2. 쓰기 지연 - DB의 INSERT/UPDATE/DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 한번에 날린다. 3. 1차 캐싱 - ID를 기준으로 Entity를 기억한다 이렇게 캐싱된 객체는 완전히 동일하다.

Naver Blog

01. 도서관리 애플리케이션의 요구사항

사용자 도서관의 사용자를 등록할 수 있다. (이름 필수, 나이 선택) 도서관 사용자의 목록을 볼 수 있다. 도서관 사용자 이름을 업데이트 할 수 있다. 도서관 사용자를 삭제할 수 있다. 책 도서관에 책을 등록 및 삭제할 수 있다. 사용자가 책을 빌릴 수 있다 (단, 다른 사람이 그 책을 빌렸다면 빌릴 수 없다.) 사용자가 책을 반납할 수 있다.

Naver Blog

02. 유저 생성 API 개발

도서관 사용자를 등록할 수 있다. (이름 필수, 나이 선택) HTTP MethodL POST HTTP Path: /user HTTP Body (JSON) 결과 반환 X (HTTP 상태 200 OK이면 충분하다) HTTP Path: /user로 들어오는 user의 값을 POST 형식으로 userCreateRequest 객체로 받아 userRepository에 저장한다. 각각에 해당되는 DTO / Controller / Service / Repository를 순서대로 만든다. @Getter @Setter public class UserCreateRequest { private String name; private Integer age; } @RestController public class UserController { private final UserService userService; @Autowired public UserController(UserService userServic

Naver Blog

03. 유저 조회 API 개발

유저 조회 API 스펙 HTTP Mehtod: GET HTTP Path: /user 쿼리: 없음 결과 반환 X Service / Controller를 차례로 추가한다. public List<User> getUsers(){ return userRepository.findAll(); } @GetMapping("/user") public List<User> getUsers(){ return userService.getUsers(); } POSTMAN으로 확인한다.

Naver Blog

04. 유저 업데이트, 삭제 API 개발

1. 도서관 사용자 이름을 업데이트 할 수 있다. HTTP Method: PUT HTTP Path: /user HTTP Body (JSON) 결과 반환 X (HTTP 상태 200 OK) DTO / Service / Controller 계층에 메소드를 추가한다. DTO @Getter @Setter public class UserUpdateRequest { private long id; private String name; } Service public void updateUser(UserUpdateRequest request) { User findUser = userRepository.findById(request.getId()) .orElseThrow(EntityExistsException::new); findUser.setName(request.getName()); userRepository.save(findUser); } Controller @PutMapping("/user")

Naver Blog

05. 책 생성 API 개발

요구사항: 도서관에 책을 등록할 수 있다. API 스펙 - HTTP Method: POST - HTTP Path: /book - HTTP Body(Json) - 결과 반환 X (HTTP 상태 200 OK -> 추후에 변경 가능) 패키지 구성은 아래와 같이 한다. Book Entity 객체를 생성한다. @Entity @Table(name = "book") @Getter @Setter @ToString public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; @Column(nullable = false) private String name; } BookRepository를 생성한다. public interface BookRepository extends JpaRepository<Book, Long> { } DTO를 생성한다. @Get

Naver Blog

06. 대출 기능 개발하기

요구사항 - 사용자가 책을 빌릴 수 있다. 다른 사람이 그 책을 진작 빌렸다면, 빌릴 수 없다. API 스펙 확인 - HTTP Method: POST - HTTP Path: /book/loan - HTTP Body (JSON) - 결과 반환 X (HTTP 상태 200 OK이면 충분하다) 요구사항을 보니 지금 테이블로는 충분하지 않다 - 유저의 대출 기록을 저장하는 새로운 테이블이 필요하다 - user_loan_history 테이블을 추가한다. user_loan_history table이 아래와 같이 되어 있을때, 2번 유저는 2권의 책을 빌렸고 클린코드는 반납했고 테스트 주도 개발은 대출중이라는 것을 확인할 수 있다. UserLoanHistory 엔티티와 Repository를 만든다. @Entity @Table(name = "user_loan_history") @Getter @Setter public class UserLoanHistory { @Id @GeneratedValue(st

Naver Blog

07. 베포란 무엇인가

배포: 최종 사용자에게 SW를 전달하는 과정 도서관리 애플리케이션의 현재 상황 우리 컴퓨터에 우리가 작성한 코드, 스프링, MySQL등이 모두 있다 친구 (최종 사용자)가 우리의 서버를 쓸 수 있는 방법으로 생각해본다고 하면 친구의 컴퓨터를 이용해 우리 컴퓨터에 접속하는 방안이 있을 수 있다. 그러나 이러한 문제는 우리 컴퓨터가 24시간 동안 켜져 있지 않다는 것이다. 또한 우리 컴퓨터는 스프링, MySQL 외에도 문서 편집기, 게임, 비디오 재생 등을 처리한다. 결국 이러한 문제점들 때문에 전용 컴퓨터에 코드를 옮기고 스프링, MySQL 등을 설치해 친구가 접속하게 하는 방법이 있다. 결론적으로 배포란 전용 컴퓨터에 우리의 서버를 옮겨 실행시키는 것이다. 이러한 전용 컴퓨터를 위해 미국 쇼핑몰 아마존이 운영하는 AWS (Amazon Web Service)를 이용한다. AWS에서 전용 컴퓨터를 빌릴 때 알아두어야 할 점은 우리가 컴퓨터를 살 때 운영체제(OS)도 같이 선택한다. 서버

Naver Blog

08. profile과 H2 DB

배포를 할 때 전용 컴퓨터(리눅스)에 설치한 java / mysql을 실행한다. 전용 컴퓨터에서 실행된 서버는 전용 컴퓨터에 있는 mysql을 사용한다. 똑같은 서버 코드를 실행시키지만, 우리 컴퓨터에서 사용할 때는 우리 컴퓨터의 MySQL 전용 컴퓨터에서 사용할 때는 전용 컴퓨터의 MySQL H2 DB란? - 경량 Database로, 개발 단계에서 많이 사용하며 디스크가 아닌 메모리에 데이터를 저장할 수 있다. -> 메모리에 데이터를 저장하면 휘발되기 때문에 개발단계에서만 사용된다. - 개발 단계에서는 테이블이 계속 변경되는데 어차피 데이터가 휘발되기 때문에 ddl-auto 옵션을 create로 주면 테이블을 신경쓰지 않고 코드에만 집중할 수 있다. - 개발 단계에서는 데이터가 휘발되는 H2가 오히려 장점이다. 이때 PROFILE을 이용해 똑같은 서버 코드를 실행시키지만, local이라는 profile을 입력하면, H2 DB를 사용하고 dev라는 profile을 입력하면 MySQL

Naver Blog

09. git과 github

1. git이란 무엇인가 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 개발자 A와 개발자 B가 각각 기능1, 4를 맡아서 개발한다고 생각해보자 그렇게 각자 개발한 버전 A와 버전 B가 있을 것이다. 결국 마지막에 하나로 합쳐야한다. git으로 인해 버전 A와 B를 합칠 수 있다. git 기초 명령어 정리 2. github이란 무엇인가 git으로 관리되는 프로젝트의 코드가 저장되는 저장소 git이 관리하는 프로젝트를 github에 저장할 수 있다. github에 코드를 저장하는 이유는 내 컴퓨터에 있는 코드는 모종의 이유로 소실될 수 있다. 또한 배포할 때 활용할 수 있다. 정리하자면 git: 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 github: git으로 관리되는 프로젝트의 코드가 저장되는 저장 라고 할 수 있다.

Naver Blog

배열로 구현한 스택

1. 스택(stack) 한 쪽 끝에서만 item(항목)을 삭제하거나 새로운 item을 저장하는 자료구조 새 item을 저장하는 연산: push Top item을 삭제하는 연산: pop 후입 선출(Last-in First-Out, LIFO) 원칙하에 item의 삽입과 삭제 수행 배열로 구현된 스택 단순 연결리스트로 구현된 스택 2. 배열로 구현한 ArrayStack 클래스 peek() 메소드: 스택이 top에 있는 item을 리턴 만일 스택이 empty일 때는 EmptyStackException을 발생시켜 예외 발생 에러 메시지 출력 후 프로그램 종료 push() 메소드: 새 item을 스택에 삽입 overflow가 발생하면 resize() 메소드를 호출하여 배열의 크기를 2배로 확장 pop() 메소드: 스택 top item을 삭제 후 리턴

Naver Blog

'Cannot construct instance of ~~' 에러

AuthenticationFilter 아래의 코드에서 발생한 에러 RequestLogin creds = new ObjectMapper().readValue(request.getInputStream(), RequestLogin.class); 기본 생성자만 만들어주면 된다. ObjectMapper가 @RequestBody를 바인딩할 때 기본 생성자를 사용하기 때문이다. @NoArgConstructor를 붙여준다. @Data @NoArgsConstructor public class RequestLogin { @NotNull @Size(min = 2, message = "Email not be less than two characters") @Email private String email; @NotNull @Size(min = 2, message = "Password must be equals or greater than 8 characters") private String passwor

Naver Blog

JJWT 라이브러리 설치 에러

runtimeOnly group dependency를 추가해주면 된다. implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'

Naver Blog

Spring Boot로 개발하는 RESTful Service

1. REST API란 RESTful API란 RESTful API란 Representational State Transfer의 약어인 REST 아키텍처 스타일을 따르는 API를 말합니다. 즉, RESTful API는 REST 아키텍처 스타일을 기반으로 설계된 API입니다. RESTful API는 HTTP 프로토콜을 이용하여 클라이언트와 서버 간 통신을 수행합니다. 클라이언트는 HTTP 메서드를 이용하여 서버의 리소스에 접근하며, 서버는 HTTP 응답 코드와 함께 데이터를 반환합니다. RESTful API의 특징은 다음과 같습니다. 자원 지향적 (Resource Oriented) 모든 자원에 고유한 ID가 존재하고, 이를 이용하여 자원을 구분합니다. 메시지 기반 (Message Oriented) 클라이언트와 서버 간 메시지를 주고받아 통신합니다. 자체 표현 (Self-describing) 메시지에는 리소스에 대한 정보가 포함되어 있으며, 이를 통해 리소스에 대한 자체 표현력을 가집니

Naver Blog

User Service API 구현

1. User 도메인 클래스 생성 아직 JPA와 연동하지 않고 간단하게 설계하겠습니다. DB를 사용하지 않고 List에 저장하여 가져오는 식으로 설계합니다. 고정적으로 List에 저장할 User 3개를 만들어준다. findAll() method: List에 있는 모든 User들을 반환한다. save() method: List<User>에 user를 저장한다. findOne() method: id의 일치 여부를 확인해 확인된 id를 가진 user를 반환한다. @Service public class UserDaoService { private static List<User> users = new ArrayList<>(); private static int usersCount = 3; // 고정적으로 List에 저장할 User 3개를 만들어준다. static { users.add(new User(1, "Euics", new Date())); users.add(new User(2, "Boo

Naver Blog

1-2주차: 기계학습 개요

AI, Machine Learning, 그리고 Deep Learning AI (Artifical Intelligence)는 컴퓨터로 만들어진 지능으로 "사람에 의해 통상적으로 수행되는 지적인 작업을 자동화 하는 것을 목표"(Chollet, 2018)로 하는 학문 영역임 또한 4차 산업혁명의 핵심인 machine learning과 deep learning을 포괄하는 보다 광범위한 개념임 AI (artificial intelligence)는? 통게학이랑 인공지능이랑 연관이 많이 되어 있음 Machine Learning 부호적 AI 에어컨과 같은 규칙 위주의 AI들은 부호적 AI의 예시이다. ML (Machine learning) 기계학습은 데이터를 기반으로 통계적 추측을 실행한다. 예를들어 고양이/강아지 사진들이 있을때 고양이와 강아지 사진의 특징을 뽑아서 예측한다. 통계적 머신러닝과 딥러닝 통계적 머신러닝과 딥러닝의 자료 크기와 정밀도의 관계는 아래의 그래프와 같다. 통계적인 머신러닝

Naver Blog

RESTful Service 기능 확장

1. 유효성 체크를 위한 Validation API 사용 Validation API란 Validation API는 자바에서 객체의 유효성을 검증하는 데 사용되는 API입니다. 이 API를 사용하면 애플리케이션에서 사용하는 객체의 값이나 상태가 올바른지 검증할 수 있습니다. Validation API는 다양한 제약 조건(Constraint)을 정의하여 객체의 속성에 대한 유효성 검증을 수행할 수 있습니다. 예를 들어, @NotNull, @Size, @Min, @Max, @Email과 같은 제약 조건을 정의할 수 있습니다. Validation API를 사용하려면 객체의 필드에 제약 조건 애노테이션을 지정하고, 검증할 때는 Validator 인터페이스를 사용합니다. Validator 인터페이스는 객체를 검증하고 검증 결과를 반환하는 메서드들을 제공합니다. Validation API는 자바 표준 스펙이며, 자바 빈즈(JavaBeans) 표준 스펙과 함께 사용됩니다. 자바 빈즈는 객체의 구성

Naver Blog

Spring Boot API 사용

1. Level3 단계의 REST API구현을 위한 HATEOAS 적용 HATEOAS란 HATEOAS는 "Hypermedia as the Engine of Application State"의 약어로, RESTful API 디자인의 한 가지 방법론입니다. 이 방법론에서는, API의 리소스와 상태 전이에 대한 정보를 hypermedia 링크를 통해 제공하여 클라이언트가 API와 상호작용할 때 필요한 정보를 전달합니다. 즉, HATEOAS를 사용하면 클라이언트는 리소스에 대한 요청을 보내고, 해당 리소스와 상호작용할 수 있는 다음 가능한 단계의 링크를 수신합니다. 이렇게 하면 클라이언트는 API의 리소스에 대한 상태를 이해하고, 그에 따라 적절한 조치를 취할 수 있습니다. 예를 들어, RESTful API에서는 클라이언트가 자원을 수정하는 데 필요한 정보와 함께 PUT 또는 PATCH 요청을 수행해야합니다. 그러나 HATEOAS를 사용하면 클라이언트는 수정 가능한 자원에 대한 링크를 수신

Naver Blog

[swagger] Failed to start bean 'documentationPluginsBootstrapper'

Spring boot에서 swagger를 사용하기 위해 아래와 같이 추가하고 서버를 실행하니 하니 아래와 같은 오류가 발생했다. // https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser

Naver Blog

Spring Security를 이용한 인증 처리

Spring Security란 Spring Security는 Spring 프레임워크 기반의 웹 애플리케이션 보안 솔루션으로, 인증(Authentication)과 권한 부여(Authorization)를 제공합니다. Spring Security는 웹 애플리케이션의 보안 요구 사항을 간단하고 효과적으로 해결할 수 있도록 다양한 보안 기능과 API를 제공합니다. Spring Security의 핵심 기능은 다음과 같습니다. 인증(Authentication) 기능: 사용자 인증 기능을 제공합니다. Spring Security는 기본적으로 다양한 인증 방식을 제공하며, 커스텀 인증 방식도 구현할 수 있습니다. 권한 부여(Authorization) 기능: 인증된 사용자가 특정 자원에 접근할 권한이 있는지 확인하는 기능을 제공합니다. 보안 기능: 웹 애플리케이션의 보안에 관련된 기능을 제공합니다. 예를 들어, CSRF 공격 방어, XSS 공격 방어, HTTP 보안 등의 기능을 제공합니다. 세션 관리

Naver Blog

Spring Security VS JWT 토큰

Spring Security와 JWT 토큰 Spring Security는 인증과 권한 부여를 처리하기 위한 프레임워크로, JWT(JSON Web Token)를 사용하지 않고도 사용할 수 있습니다. Spring Security는 다양한 인증 방식을 지원하며, 기본적으로는 세션 기반 인증을 사용합니다. 세션 기반 인증은 서버 측에서 세션 정보를 관리하고, 세션 ID를 클라이언트에게 전달하여 인증을 유지하는 방식입니다. 그러나 JWT는 세션 기반 인증과 달리, 클라이언트 측에서 토큰 정보를 관리하며, 서버는 토큰의 유효성만 검사하면 됩니다. 이는 서버의 확장성과 분산 환경에서의 이점을 제공합니다. 따라서 JWT를 사용하면 세션 기반 인증보다 더 유연하고 확장성 있는 인증 방식을 구현할 수 있으며, Spring Security에서도 JWT를 사용하는 방법을 제공합니다. 하지만 JWT를 사용하지 않고도 Spring Security를 사용할 수 있으며, 사용자의 요구 사항과 상황에 따라 다양한

Naver Blog

2-1주차: 기계학습 개요

3. 평가와 예측 평가를 한다는것을 결국 모델이 얼마나 결과가 잘 나오는지 확인을 하는 것이다. Training dataset에서는 예측을 잘하지만 Test dataset은 잘 예측하지 못하는건 과대적합이라고 할 수 있다. 이 때, 모든 데이터를 수집할 수 없기 때문에 일반화 능력이 중요하다. 예를들어, Test dataset에 있는 처음보는 강아지/고양이 사진이더라도 결정을 잘 내려주어야 한다는 것이다. 앞선 일련의 과정을 통해 선택된 모형을 학습에 이용하지 않았던 test dataset 에 적합 시켜 generalization error를 계산하여 over-fitting (또는 underfitting) 여부를 평가하는 것이다. 과대적합의 해결책으로는 통계적 머신러닝에서 L1 또는 L2 규제화가 있다. 결론적으로 지금까지 1-2주차에 걸쳐 진행했던 기계학습의 과정들을 도식화하면 아래와 같다. Machine Learning 방법들 Machine Learning의 방법들은 아래와 같다

Naver Blog

1주차

생명(生命)이란? 1. 생명 : 생명체가 살아서 숨쉬고 활동할 수 있는 힘. 2. 생명체 : 살아있는 것, 즉 생명현상을 영위하는 것. 생명체는 어떤 특징을 가지나? 1. 조직화 2. 환경에 대한 반응과 항상성 3. 생장과 발생 4. 물질대사 5. 생식 6. 진화적 적응 생명체는 어떻게 구성되어 있나? 원자에서 생물까지 ; 생물로 조직화 분자 -> 세포소기관 -> 세포 -> 조직 -> 기관과 기관계 생물에서 생태계까지 ; 기능적 생태계로 조직화 기관과 기관계 -> 생물 개체 -> 개체군 -> 군집 -> 생태계 -> 생물권 생체내에서 발견되는 원소들 산소(O) > 탄소(C) > 수소(H) > 질소(N) 생명체를 구성하는 분자에는 어떤 것이 있나? 생명체에서 가장 많은 성분: 물 생체분자(biological molecule) : 단백질, 탄수화물, 핵산, 지질 구성분자 1) 구성분자의 종류 (1) 생체분자(biological molecule) : 단백질, 탄수화물, 핵산, 지질 (2

Naver Blog

2-1주차

지질 1) 지질(lipid)이란 (1) 물에 녹지 않는 탄화수소(CH2)n로서 분자 내에 많은 비극성 공유결합으 로 이루어진 분자. (2) 지질은 소수성(hydrophobic) 분자. (3) 에너지를 많이 포함. 2) 지질의 종류 (1) 트리글리세리드 (중성지방) ① 모두 단순지질로서 트리글리세리드는 글리세롤(glycerol) 한 분자가 3분자의 지방산 (fatty acid)과 탈수축합반응 (에스터결합)으로 공유결합된 형태. ② 상온에서 고체인 트리글리세리드를 지방 (fat), 액체인 것은 기름(oil). ③ 포화지방산 (saturated fatty acid) : 탄화수소 사슬의 탄소와 탄소 사이의 결합이 모두 단일 결합인 지방산 ④ 불포화지방산 (unsaturated fatty acid) : 탄화수소 사슬의 탄소 사이의 결합 중 하나 이상의 이중 결합을 갖는 지방산 ⑤ 트렌스지방 (trans fat, trans fatty acids) : 불포화지방산으로 분류. 불포화지방산을 고체

Naver Blog

Java Persistence API 개요

JPA JPA는 Java Persistence API의 약어입니다. Java Persistence API는 Java EE 및 Java SE 환경에서 관계형 데이터베이스를 다루기 위한 자바 ORM(Object-Relational Mapping) 프레임워크입니다. JPA는 데이터베이스의 데이터와 자바 언어의 객체 간의 매핑을 담당하며, 객체를 데이터베이스에 저장하고 검색하거나 수정 및 삭제하는 등의 작업을 쉽게 수행할 수 있도록 지원합니다. JPA는 일반적으로 ORM 기술 중 하나로 분류되며, Hibernate, EclipseLink, OpenJPA 등의 구현체가 있습니다. JPA를 사용하면 개발자는 SQL 쿼리를 작성하지 않고도 데이터베이스 조작을 수행할 수 있으며, 객체 지향적인 개발을 하면서도 데이터베이스에 대한 접근과 조작이 가능해집니다. 이로 인해 개발 생산성과 유지보수성이 향상되며, 코드의 가독성이 높아지는 장점이 있습니다. Hibernate Hibernate는 자바 객체 관

Naver Blog

Spring Data JPA를 이용한 Entity설정과 초기 데이터 설정

@Entity 어노테이션을 이용하여 만들었던 User 도메인을 h2-DB와 연동시켜줍니다. User 클래스의 코드는 아래와 같습니다. 이때 user가 예약어가 되어있기 때문에 Entity name을 users로 설정해줍니다. @Data @AllArgsConstructor @NoArgsConstructor // @JsonIgnoreProperties(value = {"password"}) // @JsonFilter("UserInfo") @ApiModel(description = "사용자 상세 정보를 위한 도메인 객체") @Entity(name = "users") public class User { @Id @GeneratedValue @Column(name = "users_id") private Integer id; @Size(min = 2, message = "Name은 두글자 이상 입력해주세요.") @ApiModelProperty(notes = "사용자의 이름을 입력해 주세요.")

Naver Blog

Error creating bean with name 'dataSourceScriptDatabaseInitializer' ...

Error creating bean with name 'dataSourceScriptDatabaseInitializer' ... H2 Database가 2.1.212 버전에서 user 키워드가 예약어로 지정되어 해당 버전 이후부턴 user라는 테이블 생성이 이제 안된다. h2 버전의 이유라면 다음과 같이 3가지 방법으로 해결할 수 있다. 방법 1. H2 Database Version을 2.1.212 ---> 1.4.200으로 변경. 방법 2. properties.yml의 url에 NON_KEYWORDS=USER 설정 추가 spring: datasource: url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER 방법 3. 테이블 이름 변경 > Table이름을 User -> Users로 변경. > data.sql의 user -> users로 변경.

Naver Blog

JdbcSQLIntegrityConstraintViolationExceptionUnique index or primary key violation

JdbcSQLIntegrityConstraintViolationException Unique index or primary key violation 이건 프로그래밍 실수로 인해 발생할 수 있는 오류입니다. Primary나 Unique 제약조건을 설정한 컬럼에 대해 그 제약조건을 위반했을 때 발생합니다. PK로 설정된 컬럼의 어떤 값이 DB에 이미들어 있는데 또 insert하려는 경우 등이 이에 해당합니다. 로그를 보면 자세한 원인까지 출력됩니다.

Naver Blog

JPA Service 구현을 위한 Controller, Repository 생성

JpaRepository란 JpaRepository는 Spring Data JPA에서 제공하는 인터페이스 중 하나로, JPA(Java Persistence API) 기반의 데이터 액세스를 쉽게 구현할 수 있도록 도와줍니다. JpaRepository 인터페이스는 CRUD(Create, Read, Update, Delete) 메서드와 정렬, 페이징, 동적 쿼리 생성 등의 기능을 제공합니다. 이를 통해 개발자는 간단하게 데이터 액세스 레이어를 구현할 수 있습니다. JpaRepository 인터페이스는 Spring Data JPA에서 제공하는 다양한 인터페이스 중 하나이며, 다른 인터페이스와 함께 사용할 수도 있습니다. 예를 들어, PagingAndSortingRepository 인터페이스는 JpaRepository 인터페이스를 상속하고 있으며, 페이징과 정렬 기능을 추가로 제공합니다. JpaRepository 인터페이스를 구현하는 클래스는 @Repository 어노테이션을 추가하여 스프링

Naver Blog

JPA를 이용한 사용자 목록 조회 - GET HTTP Method

Optional<T>란 Optional<T>는 Java 8에서 추가된 클래스로, Null Pointer Exception을 방지하기 위한 방법 중 하나입니다. Optional<T>는 값이 있을 수도 있고, 없을 수도 있는 객체를 감싸는 래퍼 클래스입니다. Optional<T>는 T 타입의 객체를 감싸고 있으며, 값이 있으면 해당 객체를 반환하고, 값이 없으면 null 대신 Optional.empty()를 반환합니다. 이를 통해 null 값을 반환하거나 null 체크를 하지 않아도 되어 코드의 가독성을 높이고, NullPointerException을 방지할 수 있습니다. Optional<T>는 다양한 메서드를 제공하며, 이를 통해 Optional 객체를 다루는데 유용합니다. 예를 들어, isPresent() 메서드는 Optional 객체에 값이 있는지 확인하며, get() 메서드는 Optional 객체에 있는 값을 반환합니다. orElse(T other) 메서드는 Optional 객체

Naver Blog

JPA를 이용한 사용자 추가와 삭제 - POST/DELETE HTTP Method

사용자 삭제를 위해 JpaRepository의 deleteById() 메소드를 사용합니다. @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id){ userRepository.deleteById(id); } id값이 1인 user를 삭제한 후 전체 사용자 목록을 조회합니다. POSTMAN에 아래와 같이 id가 1인 사용자가 삭제된 것을 확인할 수 있습니다. 새로운 사용자를 추가하기 위해 JpaRepository의 save() 메소드를 사용합니다. @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user){ User savedUser = userRepository.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .p

Naver Blog

게시물 관리를 위한 Post Entity 추가와 초기 데이터 생성

JPA 연관관계 매핑 JPA(Java Persistence API)에서는 객체 간의 연관관계를 매핑하여 관계형 데이터베이스에 저장할 수 있습니다. 연관관계 매핑은 객체 지향 프로그래밍의 특징인 상속, 다형성 등을 지원하여 객체 간의 관계를 효과적으로 표현할 수 있습니다. JPA에서는 다음과 같은 세 가지 방식으로 연관관계를 매핑합니다. 일대일 (One-to-One) 관계 하나의 객체가 다른 하나의 객체와 관계를 맺는 것을 의미합니다. 대부분의 경우 일대일 관계는 외래 키를 사용하여 매핑합니다. 일대다 (One-to-Many) 관계 하나의 객체가 다른 여러 개의 객체와 관계를 맺는 것을 의미합니다. 일대다 관계는 일대다 관계를 갖는 두 객체의 중간에 연결 객체를 두어 매핑할 수 있습니다. 다대다 (Many-to-Many) 관계 다수의 객체가 다수의 객체와 관계를 맺는 것을 의미합니다. 다대다 관계는 일대다 관계와 마찬가지로 연결 객체를 두어 매핑할 수 있습니다. 연관관계 매핑을 위해

Naver Blog

게시물 조회를 위한 Post Entity와 User Entity와의 관계 설정

사용자의 id를 통해 그 사용자가 작성한 Post 내용들을 전부 List에 담아 반환하는 Controller를 추가해줍니다. // URL: /jpa/users/90001/posts @GetMapping("/users/{id}/posts") public List<Post> retrieveAllPostsByUser(@PathVariable int id){ Optional<User> user = userRepository.findById(id); if(user.isEmpty()) throw new UserNotFoundException(String.format("ID[%s] not found", id)); return user.get().getPosts(); } POSTMAN을 통해 확인하면 아래와 같이 id가 90001인 사용자의 Post 정보를 확인할 수 있습니다. 또한 전체 사용자 목록 조회를 하면 연관관계 매핑에 의해 Post 정보들도 같이 확인할 수 있습니다.

Naver Blog

JPA를 이용한 새 게시물 추가 - POST HTTP Method

JPA를 이용해 새 게시물을 추가하기 위해 JpaRepository를 상속받는 PostRepository를 생성합니다. @Repository public interface PostRepository extends JpaRepository<Post, Integer> { } POST Http Mehtod를 이용해 게시물을 추가하는 Controller를 추가합니다. @PostMapping("/users/{id}/posts") public ResponseEntity<Post> createPost(@PathVariable int id, @RequestBody Post post){ Optional<User> user = userRepository.findById(id); if(user.isEmpty()) throw new UserNotFoundException(String.format("ID[%s] not found", id)); post.setUser(user.get()); Post save

Naver Blog

RESTful API 설계 가이드

Richardson Maturity Model 소개 Richardson Maturity Model은 RESTful API의 성숙도를 평가하는 모델입니다. 이 모델은 로이 필딩(Roy Fielding)의 박사학위 논문에서 소개된 REST의 원칙을 따르며, RESTful API의 성숙도를 3단계로 구분합니다. Level 0: The Swamp of POX HTTP 프로토콜을 사용하지만, HTTP 메소드를 적절하게 활용하지 않는다. 모든 API 엔드포인트가 단 하나의 URI를 사용한다. SOAP 등의 웹 서비스보다도 낮은 수준의 웹 서비스이다. Level 1: Resources 여러 개의 URI를 사용하여 각 리소스를 식별한다. HTTP 메소드를 사용하여 리소스를 생성, 조회, 수정, 삭제한다. 엔드포인트는 리소스 유형에 대한 작업을 수행한다. Level 0에 비해 리소스가 URI로 식별되는 점에서 진보하지만, 리소스 간의 관계가 부족하다. Level 2: HTTP Verbs HTTP 메

Naver Blog

2-2주차

4) 뉴클레오타이드의 상보적 염기쌍 형성 1) 폴리뉴클레오타이드 사슬은 상보적 염기쌍(complementary base pairing)을 형성하는데, 두 사슬의 염기쌍 사이의 수소결합을 통해 구조가 안정됨. 2) A=T, G=C 와 수소결합에 의한 염기쌍 형성. A와 T 사이에는 2중 수소 결합, G와 C 사이에는 3중 수소결합. 3) 이중가닥의 역평행성 DNA 두 가닥의 방향은 5′에서 3′으로 서로 반대로 뻗어 있는데, 이렇게 두 가닥의 DNA가 서로 반대 방향으로 놓인 것을 이중가닥의 역평행성(antiparallel) 배열이라고 함. 5) 핵산의 기능 (1) 핵산은 생명활동을 가능하게 하는 복제 가능한 유전물질. (2) 유전자 발현 : RNA을 합성을 지시하며, RNA를 통해 단백질 합성을 조절 1.5 세포는 어떤 종류가 있나? 생명체는 원핵생물(prokaryote)과 진핵생물(eukaryote)로 분류. 1. 원핵세포 (prokaryotic cell) 1) 원핵생물의 특성

Naver Blog

2-2주차: 기계학습 기초수학

PREVIEW 1) 기계학습에서 수학의 역할 기계학습에서의 수학은 기계가 무언가를 학습시킬 수 있게끔 해주는 도구 수학은 목적함수를 정의하고, 목적함수가 최저가 되는 점을 찾아주는 최적화 이론 제공 수학은 모델이 예측을 잘할 수 있도록 부품을 조정하는 것이 중요한데 그 부품을 조정하는 것 최적화 이론에 규제, 모멘텀, 학습률, 멈춤조건과 같은 제어를 추가하여 알고리즘 구축 사람은 알고리즘을 설계하고 데이터를 수집함 2) 기계학습과 밀접한 연관이 있는 수학 벡터와 행렬 (표기법에 대해 학습 EX. transform) 1) 벡터 샘플을 특징 벡터로 표현 EX: Iris 데이터에서 꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비라는 4개의 특징이 각각 5.1, 3.5, 1.4, 0.2인 샘플 여러 개의 특징 벡터를 첨자로 구분 2) 행렬 여러 개의 벡터를 담음 훈련집합을 담은 행렬을 설계행렬이라 부름 EX: Iris 데이터에 있는 150개의 샘플을 설계 행렬 X로 표현 3) 행

Naver Blog

3-1주차: 기계학습 기초수학

확률기초 1) 확률변수 EX: 윷 다섯 가지 경우 중 한 값을 갖는 확률변수 x x의 정의역은 {도, 개, 걸, 윷, 모} 2) 확률분포 3) 확률벡터 EX: Iris에서 확률벡터 x는 4차원 c = (c1, c2, c3, c4)' = (꽃받침 길이, 꽃받침 너비1, 꽃잎 길이, 꽃잎 너비)' 4) 간단한 확률실험 장치 주머니에서 번호를 뽑은 다음, 번호에 따라 해당 병에서 공을 뽑고 색을 관찰함 번호를 y, 공의 색을 x라는 확률변수로 표현하면 정의역은 y∈{①,②,③}, x∈{파랑, 하양} 5) 곱 규칙과 합 규칙 ①번 카드를 뽑을 확률은 P(y=①)=P(①)=1/8 카드는 ①번, 공은 하양일 확률은 P(y=①,x=하양)=P(①,하양) <- 결합확률 곱 규칙 합 규칙 베이즈 정리와 기계학습 (중요) 1) 베이즈 정리 "하연 공이 나왔다는 사실만 알고 어느 병에서 나왔는지 모르는데, 어느 병인지 추정하라. 2) 간단한 확률실험 장치에 베이즈 정리를 적용 세 가지 경우에 대해 확률을

Naver Blog

3-2주차: 기계학습 기초수학

정보이론 1) 메시지가 지닌 정보를 수량화할 수 있나? “고비 사막에 눈이 왔다”와 “대관령에 눈이 왔다”라는 두 메시지 중 어느 것이 더 많은 정보를 가지나? 정보이론의 기본 원리 -> 확률이 작을수록 많은 정보 2) 자기 정보self information 사건(메시지) ℯcc의 정보량 (단위: 비트 또는 나츠) 3) 엔트로피 확률변수 x의 불확실성을 나타내는 엔트로피 4) 자기 정보와 엔트로피 예제 주사위가 윷보다 엔트로피가 높은 이유는? 확률이 균일할수록(= 확률이 다 같을수록) 엔트로피가 크다. 5) 교차 엔트로피cross entropy 두 확률분포 P와 Q 사이의 교차 엔트로피 식을 전개하면, 6) 예시 최적화 1) 순수 수학 최적화와 기계 학습 최적화의 차이 기계 학습의 최적화는 단지 훈련집합이 주어지고, 훈련집합에 따라 정해지는 목적함수의 최저점을 찾아야 함 • 데이터로 미분하는 과정 필요 -> 오류 역전파 알고리즘 (딥러닝) • 주로 SGD(스토캐스틱 경사 하강법) 사

Naver Blog

[Java] Invalid character found in method name. HTTP method names must be tokens 에러

에러 원인 : https가 활성화되지 않았는데 https에 요청을 하는 경우 에러 해결 - HTTP 통신 시 https://~~~를 http://~~~로 수정 카카오 로그인을 구현하는 와중 Redirect URL을 https 로 설정했더니 이런 오류가 발생하였다 ..

Naver Blog

4-2주차: 사전과정과 최적화

Scikit-learn • Python은 머신러닝 알고리즘을 수행할 수 있는 많은 라이브러리를 제공 • 그 중에서도 가장 널리 알려진것이 scikit-learn • 변수 – 특성(feature)변수: 독립(independent)변수 또는 외생(exogenous)변수 → x 변수[n_sample, n_features]: 2D 텐서 – 목적(target)변수: 종속(dependent)변수 또는 내생(endogenous)변수 → y 변수[n_sample, n_features]: 2D 텐서 • 예를 들어, x=[1,2,3,4,5]에 대하여 – x가 5개의 표본이고 특성변수가 1개인 자료 → x1=[5,1] 이 되어야 함 – x가 1개의 표본이고 특성변수가 5개인 자료 → x2=[1,5] 이 되어야 함 Scikit-learn 이용 절차 1. 적절한 모형 추정 클래스를 scikit-learn으로부터 import한다. 2. 모형 추정 클래스에 필요한 초모수(hyper-parameter)들의 값을

Naver Blog

5-2주차: K-Nearest Neighbors

K-Nearest Neighbors (KNN) K-Nearest Neighbors (KNN)는 간단하지만 강력한 분류 알고리즘으로, 주어진 데이터의 유사도를 기반으로 분류를 수행합니다. 이 알고리즘은 Non-parametric이며, Lazy learning (또는 instance-based learning)에 속합니다. Lazy learning이란, 테스트 샘플이 주어지기 전까지 어떤 학습도 하지 않는 방식을 말합니다. KNN 알고리즘은 추가적인 추정방법 또는 모형이 없습니다. 대신 고려할 이웃 데이터 수 k와 거리 측정 metric만 결정하면 됩니다. 분류가 필요한 새로운 데이터가 생기면, 해당 데이터로부터 가장 가까운 k개의 데이터를 찾아 분류를 결정합니다. KNN 알고리즘의 동작 방식은 다음과 같습니다. 먼저, 분류하려는 데이터와 가장 가까운 k개의 데이터를 찾습니다. 이 때 거리 측정 metric을 사용하여 데이터 간 거리를 계산합니다. 그 다음, 이 k개의 데이터의 레이블을

Naver Blog

6-1주차: K-Nearest Neighbors

거리 측도의 종류 • Euclidean distance • Manhattan distance • Minkowski distance 커널 함수 (Kernel Function) 커널 함수는 KNN 알고리즘에서 가중치를 부여하기 위해 사용되는 함수입니다. 일반적으로 가장 가까운 이웃 데이터에 1의 가중치를 부여하고, 나머지 데이터에는 0의 가중치를 부여하는 것이 기본적인 KNN 알고리즘의 동작 방식입니다. 이것을 일반화하여, 각 데이터 점에 대한 가중치를 부여하는 함수를 커널 함수라고 합니다. 커널 함수는 입력된 데이터 점과 특정 점 사이의 거리에 따라 가중치를 결정합니다. 예를 들어 Gaussian 커널 함수는 평균이 0이고 분산이 c^2 인 정규 분포를 따르며, 입력 데이터와 특정 점 사이의 거리가 가까울수록 높은 가중치를 부여합니다. 커널 함수를 사용하면 데이터의 패턴을 더 잘 파악할 수 있으며, 이를 통해 KNN 알고리즘의 성능을 높일 수 있습니다. 하지만, 어떤 커널 함수를 사용

Naver Blog

6-2주차: Logistic Regression

Logistic Regression 개요 • 일반적인 선형 회귀 문제 일반적인 선형 회귀 문제에서는 수치형 특징 변수 X와 연속형 숫자로 이뤄진 종속 변수 Y 간의 관계를 선형으로 가정하고 이를 가장 잘 표현할 수 있는 회귀 계수를 데이터로부터 추정합니다. 1차원 선형 회귀에서는 y = a + bx와 같은 모델을 사용합니다. 여기서 a는 y 절편을 나타내며, b는 x의 기울기를 나타냅니다. 이 모델을 사용하여 주어진 데이터에서 최적의 a와 b를 추정합니다. 즉, 주어진 데이터에서 가장 잘 맞는 직선을 찾아냅니다. 2차원 선형 회귀에서는 y = ax1 + bx2 + c와 같은 모델을 사용합니다. 여기서 a와 b는 각각 x1과 x2의 기울기를 나타내며, c는 y 절편을 나타냅니다. 이 모델을 사용하여 주어진 데이터에서 최적의 a, b, c를 추정합니다. 즉, 주어진 데이터에서 가장 잘 맞는 평면을 찾아냅니다. • 로지스틱 회귀 문제 로지스틱 회귀는 특징 변수 X와 범주형(categori

Naver Blog

7-1주차: Logistic Regression

c의 추정 및 분류 • 손실함수로 음의 로그우도함수를 적용 로지스틱 회귀에서는 가중치 벡터 c를 추정하는 것이 중요합니다. 이를 위해 손실 함수로 음의 로그우도함수를 적용하는데, 이는 각각의 cc가 독립적이라는 가정 하에, 주어진 cc 들에 대해서 cc가 발생할 확률을 최대화하는 가중치 벡터를 찾는 것입니다. 우도함수는 c개의 데이터에 대한 cc의 곱으로 나타낼 수 있습니다. 여기서 cc는 cc와 가중치 벡터의 내적으로 계산되는 선형 함수를 활성화 함수에 통과시켜 얻은 확률입니다. 따라서 손실 함수로 음의 로그우도함수를 사용하면, 가중치 벡터를 최적화하는 과정에서 얻은 확률 값이 실제 c값과 가장 일치하도록 할 수 있습니다. 이때 로그우도함수에 음수를 취하면, 손실 함수로서 사용할 수 있습니다. 이러한 손실 함수를 이용하여 경사 하강법과 같은 최적화 알고리즘을 사용하여 가중치 벡터를 추정할 수 있습니다. 이 손실 함수는 binary cross entropy로 불리며, 일반적으로 분류

Naver Blog

5-1주차: 사전과정과 최적화

손실함수 • 손실함수란? – 예측값과 실제값의 거리를 평가 • 왜 손실함수가 필요한가? – 손실함수의 값이 작아진다 -> 예측모델이 점점 정확해진다 • 손실함수를 이용하여 어떻게 모델을 학습시키는가? – 손실함수가 작아지는 방향으로 모델을 갱신 – 모델을 갱신시키는 방법 -> 최적화 손실함수 / 회귀 • 회귀 문제를 해결하기 위한 손실함수 – 평균제곱오차 (MSE) -> 가장 일반적으로 사용되는 손실함수 • 손실함수 MSE를 최소화하는 것은… – 관측치 cc에 추정치 ĉ c가 가까워지게 만든다 – ĉ은 특성변수 c들의 선형/비선형 가중결합이므로 결국 주어진 c에 대해서 관측치 c에 가장 가까운 선형/비선형 가중결합의 가중치 (weight, 모수)를 찾는것 MSE는 회귀 문제에서 가장 일반적으로 사용되는 손실함수 중 하나입니다. 이 손실함수는 관측치 cc와 대응되는 추정치 ĉ c의 차이를 제곱한 값의 평균으로 계산됩니다. 수식으로 나타내면 다음과 같습니다. MSE = (1/n)

Naver Blog

Discriminant Analysis

Discriminant analysis Bayes' Rule 기반의 Classification은 입력 변수 x가 주어졌을 때, 특정 클래스 y에 속할 확률을 계산하는 방법입니다. Bayes' Rule을 사용하여 다음과 같이 계산할 수 있습니다: P(y=k|x) = P(x|y=k) * P(y=k) / P(x) 여기서 K는 총 범주의 수이고, P(k)는 선험 정보로서 각 범주의 확률을 의미합니다. P(x|y=k)는 조건부 확률로, 범주 k에 속할 때 x가 주어졌을 때의 확률을 나타냅니다. Bayes Classifier는 다음과 같이 정의됩니다: y_hat = argmax P(y=k|x) 즉, 입력 변수 x가 주어졌을 때, 가장 확률이 높은 클래스를 예측값으로 선택합니다. Discriminant Analysis는 Bayes' Rule을 기반으로 하는 분류 알고리즘 중 하나입니다. 다변량 정규분포를 따른다는 가정하에, 각 클래스의 분포를 특정하는 평균과 공분산 행렬을 사용하여 확률을 계산합

Naver Blog

String(문자열)

String equals 두개의 String에 값만을 비교해서 같으면 true, 다르면 false를 반환한다.(대소비교) String str1 = "java"; String str2 = "java"; boolean equals = str1.equals(str2); System.out.println("equals: " + equals); // 결과값:true indexOf 지정한 문자가 문자열에 몇번째에 있는지를 반환한다. String str = "abcdef"; int indexOf = str.indexOf("d"); System.out.println("indexOf: " + indexOf); // 결과값:3 length 문자열의 길이를 반환한다. String str = "abcdef"; int length = str.length(); System.out.println("length: " + length); // 결과값:6 replace 문자열에 지정한 문자" "가 있으면 새로 지정

Naver Blog

HashSet, HashMap, TreeSet, TreeMap

HashSet, HashMap, TreeSet, TreeMap Set, Map Set Map 자료 형태 Value 만 존재 Key, Value 쌍으로 존재 중복 여부 중복 불가 Key값 중복 불가 contains contains(value) containsKey(key) get 불가 get(key) Set은 contains 메소드로 값의 존재 여부만 확인할 수 있어 특정 요소를 get하려면 iterator를 통해 얻어야 하지만, Map은 key값을 통해 해당하는 value를 바로 얻을 수 있다. Hash, Tree Hash Tree 순서 순서 없음 정렬 순서 유지 시간 복잡도 O(1) O(log n) Hash와 Tree는 전혀 다른 내부 구조를 띄고 있기 때문에 시간 복잡도가 다르다. Hash는 순서를 유지하지 않는 대신 빠른 시간을 보장하며, Tree는 트리 구조를 통해 순서를 유지하기 때문에 약간 시간이 느리다고 보면 된다. 즉, 속도(Hash)와 정렬(Tree) 이 두가지를 놓

Naver Blog

Stack

Stack란? 사전적 의미로는 '쌓다', '더미'라는 뜻을 가지고 있습니다 또한 Collection 프레임워크의 일부이며 java.util 패키에서 소속되어 있습니다 Stack의 가장 큰 특징은 후입선출(LIFO : Last In First Out)입니다 위와 같은 원리로 동작된다고 보시면 됩니다 Stack 사용법 Stack 선언 import java.util.Stack; //import Stack<Integer> stack = new Stack<>(); //int형 스택 선언 Stack<String> stack = new Stack<>(); //char형 스택 선언 자바에서 stack을 선언하려면 <stack>import java.util.Stack 을 import 한 뒤 Stack<Element> stack = new Stack<>();과 같은 형식으로 선언하면 됩니다. Stack 값 추가 Stack<Integer> stack = new Stack<>(); //int형 스택 선언

Naver Blog

Queue

Queue란? Queue란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있습니다 Queue는 사전적으로 "줄을 서다"를 의미합니다 줄을 서서 기다린다는 것처럼 먼저 들어오면 데이터가 먼저 나가는 형식입니다 일명 FIFO(FirstInFirstOut) 방식입니다 반대로 Stack은 LIFO방식이라 두 개가 많이 비교됩니다 위의 그림에서 볼 수 있지만 큐는 앞과 뒤가 다른 역할을 수행합니다 큐의 앞 부분은 front는 삭제 연산만 수행 큐의 뒷 부분은 rear는 삽입 연산만 수행합니다 보통 컴퓨터 버퍼에서 주로 사용, 여러 개가 한꺼번에 입력이 들어올 때 대기열을 만들어 순차적으로 처리할 때 사용이 됩니다 Queue 사용법 Queue 선언 import java.util.LinkedList; //import import java.util.Queue; //import Queue<Integer> queue = new LinkedList<>(); //int형 q

Naver Blog

Deque

Deque란? Deque란 Double-Ended Queue의 줄임말로 큐의 양쪽에서 데이터를 삽입과 삭제를 할 수 있는 자료구조를 의미합니다 java.util 패키지에 소속되어 있고 Null요소는 사용을 하지 못 합니다 사용하기에 따라서 Stack으로 사용될 때는 Stack보다 빠를 수 있고 대기열에서 사용될 때는 LinkedList보다 빠를 수 있습니다 Deque 선언 Deque<Integer> deque = new LinkedList<>(); Deque에 값 삽입 add() addFirst() addLast() offer() offerFirst() offerLast() add() 마지막에 원소 삽입 용량 초과 시 예외 발생 addFirst() 맨 앞에 원소 삽입 용량 초과 시 예외 발생 addLast() 마지막에 원소 삽입 용량 초과 시 예외 발생 offer() 마지막에 원소 삽입 삽입 성공 시 true, 용량 제한에 걸리는 경우 false 반환 offerFirst() 맨 앞에

Naver Blog

선택 정렬(Selection Sort)

선택 정렬 (selection sort) 란? 다음과 같은 순서를 반복하며 정렬하는 알고리즘 주어진 데이터 중, 최소값을 찾음 해당 최소값을 데이터 맨 앞에 위치한 값과 교체함 맨 앞의 위치를 뺀 나머지 데이터를 동일한 방법으로 반복함 N = 8인 다음과 같은 수열을 오름차순으로 정렬한다고 할 때, 7번째 자리에 위치해야 할 숫자는 인덱스 0번부터 7번까지에 있는 숫자들 중 가장 큰 숫자가 된다. 따라서 0번부터 7번까지의 인덱스를 순회하여 가장 큰 숫자가 있는 인덱스 1번을 알아낸다. 이후, 인덱스 7번에 있는 숫자 0과 1번에 있는 숫자 7을 swap() 함수를 이용하여 교환한다. 6번째 자리에 위치해야 할 숫자는 인덱스 0번 부터 6번까지에 있는 숫자들 중 가장 큰 숫자가 된다. 따라서 0번부터 6번까지의 인덱스를 순회하여 남아있는 숫자들 중 가장 큰 숫자가 있는 인덱스 4번을 알아낸다. 이후, 인덱스 6번에 있는 숫자 4와 인덱스 4번에 있는 숫자 6의 자리를 swap() 함

Naver Blog

버블 정렬(Bubble Sort)

버블 정렬(Bubble Sort)은 두 인접한 원소를 검사하여 정렬하는 방법이다. 시간 복잡도가 O(n2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다. *버블 정렬의 이해 ->어떤 대상을 '오름차순'으로 정렬할 때 버블 정렬은 원소를 처음부터 탐색하면서, 큰 수를 계속하여 뒤로 밀어내는 방식을 사용한다. 예를 들어 [5, 3, 1, 10, 7]이라는 배열을 버블 정렬을 이용하여 오름차순 정렬을 해보면 다음과 같다. 초기 배열 상태 먼저, Array[0]와 Array[1]을 비교해보자. Array[0]가 Array[1]보다 크기 때문에, 이 두 배열의 원소의 위치를 바꾸어준다. Array[0]와 Array[1]을 비교하고, 앞의 원소가 더 크다면 두 원소의 자리를 바꾸어준다. 다음으로 Array[1]과 Array[2]를 비교해보자. 마찬가지로 Array[1]이 Array[2]보다 크기 때

Naver Blog

삽입정렬(Insertion Sort)

*삽입 정렬(Insertion Sort) ->삽입 정렬이란 2번째 원소부터 n번째 원소까지 차례로 해당 원소가 위치할 인덱스에 원소를 삽입하는 방식을 사용하는 정렬 방식이다. ->2번째 원소부터 n번째 원소부터 차례로 각 원소가 맞는 위치에 '삽입'하는 방식을 사용하며 배열을 정렬하기 때문에 삽입 정렬이라고 이름지었다. ※사람에게 어떤 대상을 정렬하라고 한다면 무의식적으로 수행하는 정렬 방식이라고 한다! *삽입 정렬의 이해 ->어떤 대상을 '오름차순'으로 정렬할 때 삽입 정렬은 2번째 원소부터 앞의 원소와 비교하는 과정을 통해 적절한 위치에 삽입하고, n번째 원소까지 이 방식을 반복함으로써 정렬을 진행할 수 있다. 예를 들어 [6, 2, 3, 4, 1]이라는 배열을 삽입 정렬을 이용하여 오름차순 정렬을 해보면 다음과 같다. 초기 배열 상태. Array[CurIndex]는 임시 변수에 저장하여 값을 기억해둔다. 현재 선택된 원소의 앞 원소와 비교를 하며 현재 원소의 적절한 위치를 찾는

Naver Blog

이진 탐색(Binary Search)

이진 탐색 = 이분 탐색 (Binary Search) 정렬된 배열 또는 리스트에 적합한 고속 탐색 방법이다. 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄인다. 찾고자 하는 값이 속해있지 않은 부분은 전혀 고려할 필요가 없기 때문에, 매 단계에서 검색해야 할 리스트의 크기를 반으로 줄일 수 있다. 이러한 방법을 반복적으로 사용해 탐색하는 방법이 이진 탐색이다. 데이터의 삽입이나 삭제가 빈번할 시에는 적합하지 않고, 주로 고정된 데이터에 대한 탐색에 적합하다. 이진 탐색의 구현 1. 탐색의 대상이 되는 자료들이 array[low] 에서부터 array[high]에 들어있다고 가정하자. (정렬되어 있어야 함) 즉 어떤 시점에서 탐색되어야 할 범위는 low에서 high 까지가 된다. 맨 처음 low에는 0번 인덱스의 값, high에는 n-1번 인덱스의 값이 들어갈 것이다. 2. low와 high값에 의거해 중간

Naver Blog

이진트리 순회(DFS)

이진트리의 순회 이진트리에 속하는 모드 노드를 한 번씩 방문하여 노드가 가지고 있는 데이터를 목적에 맞게 처리하는 것을 의미 이진트리를 순회하는 표준적인 방법에는 전위, 중위, 후의의 3가지 방법이 있다. 루트와 왼쪽 서브 트리, 오른쪽 서브 트리 중에서 루트를 언제 방문하느냐에 따라 구분된다. 루트를 방문하는 작업을 V 왼쪽 서브 트리 방문을 L 오른쪽 서브트리 방문을 R 루트를 서브 트리에 앞서서 먼저 방문하면 전위 순회 루트를 왼쪽과 오른쪽 서브 트리 중간에 방문하면 중위 순회 루트를 서브 트리 방문 후에 방문하면 후위 순회가 된다. 이진트리에서 각각의 서브 트리 역시 이진트리이다. 전체 트리 순회의 알고리즘을 서브 트리에도 똑같이 적용해 순회한다. -> 문제의 구조는 같고 크기만 작아지는 경우 -> 순환(재귀) 적용 전위 순회 루트 노드를 방문한다. 왼쪽 서브 트리를 방문한다. 오른쪽 서브트리를 방문한다. 중위 순회 왼쪽 서브트리를 방문한다. 루트 노드를 방문한다. 오른쪽 서

Naver Blog

부분집합 BFS

부분집합 구하기 (BFS) A 집합의 원소가 n개라고 가정 했을 때 A 집합의 부분 집합 총 개수는 2ⁿ개다. (공집합 포함) 원리 집합의 원소가 {1, 2, 3}라고 가정할 때 모든 부분 집합을 구하는 것이다. 원소 하나 하나가 포함하는지, 미포함하는지 정해야한다. 예를 들어서 원소가 1~n 까지의 자연수라고 할 때 DFS(n+1) 까지의 함수를 호출해서 DFS(n+1) 일 때, 요소를 다 출력하고 함수를 빠져나오도록 작성한다. import java.util.*; import java.io.*; public class Main { static boolean[] check; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine());

1 2 3