-
테스트 코드 유지보수 해보기 3
이전 포스팅에 이어 테스트 코드 유지보수를 이어나가 보겠습니다. 이전 포스팅에서 적용한 것들은 다음과 같습니다. test datasource 설정 (1) schema.sql, data.sql 추가 (1) 기획서를 참고하여 기존 로직 수정 (2) JPA 영속성 컨텍스트 관련 이슈 조치 (2) 이렇게 했을 때, 마지막 테스트 수행 결과는 다음과 같았습니다. 에러가 발생하는 테스트 케이스 여기서는 생각보다 다양한 Exception이 발생하고 있었습니다. 도메인 예외 케이스 ex. 필수값이 없거나, 적절하지 않은 상태 등.. DB로 부터 조회 ... Read More
-
테스트 코드 유지보수 해보기 2
이전 포스팅에 이어 테스트 코드 유지보수를 이어나가 보겠습니다. 이전 포스팅에서 적용한 것들은 다음과 같습니다. test datasource 설정 schema.sql, data.sql 추가 이렇게 했을 때, 마지막 테스트 수행 결과는 다음과 같았습니다. 실패하는 테스트 케이스의 원인은 다음과 같았습니다. 테스트 예상 결과가 다른 경우 (expect ≠ result) 테스트 실행 중 에러가 발생한 경우 각 케이스 별로 살펴보겠습니다. 테스트 예상 결과가 다른 경우 기존에 작성했던 테스트 결과 대로 동작하지 않는 경우입니다. 해당 케이스들 중 첫번째는 특정 기능(ex... Read More
-
테스트 코드 유지보수 해보기 1
배경 저희 조직에서는 테스트 코드를 잘 작성하지 못하고 있었습니다. 저는 그러한 이유에는 크게 3가지가 있다고 생각했습니다. 시간 부족 테스트 코드 작성에 대한 이해 테스트 코드의 관리 상태 수 차례의 회고를 진행하며 팀원들에게 테스트 코드에 대한 중요성을 어필하였고, 관련 내용에 대해 별도로 논의를 거쳐왔습니다. 그 과정에서 3가지 중 시간 부족, 테스트 코드 작성에 대한 이해 항목은 어느 정도 해결할 수 있었습니다. 사실 마지막 항목인 테스트 코드의 관리 상태가 가장 어려운 문제였습니다. 테스트 코드는 결국 우리가 개발한 코드가 정상적으로 동작하는지 확인하는 용도가 가장 큰데, 기존에... Read More
-
간단한 조회 서비스 로직 리팩토링
배경 오늘 함께 일하시는 FE 분께서 API 응답 데이터가 요구사항과 다르다고 확인을 부탁하셨습니다. 제가 작업했던 부분은 아니었으나 해당 부분을 구현하셨던 팀원 분께서 회의 일정이 있어 제가 대응을 하게 되었습니다. 요구사항 자체는 간단했습니다. 주문 상태가 WAIT 인 데이터가 포함되면 안되었기에 해당 부분만 필터링을 추가하면 되는 작업이었습니다. 해당 기능에 대한 코드입니다. // Before public List<OrderModel> getOrderModels(List<Market> markets, boolean urgent) { Map<Long, Market&... Read More
-
테스트 파이프라인 구축 (Bitbucket, Teams 노티)
배경 저희 팀은 API, 화면 개발 모두 필요한 경우에는 BE(백엔드)와 FE(프론트엔드) 작업담당자가 REST API Request, Response 모델에 대해서 사전에 논의합니다. 논의한 내용을 바탕으로 각자 파트에서 작업을 진행하게 되죠. API 개발이 완료된 후에는 보통 DV 환경이 타 버전에 대한 검증으로 사용 중인 상황이 많기 때문에, 로컬에서 DV 환경에 DB를 바라보는 profile로 API 서버를 구동합니다. 이러한 환경에서 업무를 진행할 때, API 개발이 완료되어서 FE에 API 명세와 작업 브랜치를 전달하면 종종 문제가 발생합니다. API 에러 상황 Http ... Read More
-
JPA 엔티티 내 @Transient Bean 필드를 제거한 이유
배경 간단한 API를 개발하는 작업을 진행하고 있었습니다. 해당 기능에 대한 도메인 모델(JPA 엔티티) 로직은 이미 작성되어 있는 상태라서 추가 작업이 많이 필요하지 않았습니다. 그래서 해당 모델 로직을 그대로 사용했고, 필요한 web 코드와 도메인 서비스 코드를 작성했습니다. 우선 개발 완료 후 Swagger 상으로 간단한 호출을 해봤는데 문제가 있었습니다. 이유는 도메인 JPA 엔티티 내부에 외부 의존성을 가지는 @Transient 필드가 존재했습니다. @Entity public class Order { .. @Transient @Inject @Getter(AccessLeve... Read More
-
성능 이슈 발생한 무거운 API 튜닝하기
배경 어느 날 사내 운영 환경 검증 중에 API 응답은 504 gateway timeout 이며, 어플리케이션 서버는 OOM(out of memory)이 발생하였습니다. org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded 원인은 무거운 API가 7,000 건 이상의 데이터를 처리하면서 발생한 상황이었습니다. 7,000 건 정도의 데이터가 많지 않다고 느껴질 수 있으나, 해당 API는 데이... Read More
-
RequestDto는 왜 기본생성자가 없을 때 에러를 반환할까?
일반적으로 클라이언트가 Request Body를 통해서 서버에 API 요청할 때, 서버에서는 이걸 RequestDto에 매핑해서 전달 받는다. (ex. public ResponseDto call(@RequestBody RequestDto requestDto) { ... }) ![클라이언트와 서버가 주고 받는 DTO](https://github.com/Ting-Kim/ting-kim.github.io/blob/master/images/20210103_1.png?raw=true) 클라이언트와 서버가 주고 받는 DTO 여기서 만약 RequestDto에 기본 생성자를 구현하지 않았다면, 어떤 일이 벌어지게... Read More
-
[PS] 테트로미노 (백준 14500번)
오랜만에 Java로 PS(테트로미노 (백준 14500번))를 해봤다. 클린 코드, TDD에 대한 내용을 여기저기서 조금씩이라도 습득하면서 신경을 쓰면서 하니까 확실히 이전보다는 메서드 분리 횟수가 많아진 것 같다. 조금 고민이 되는 점은.. 클린 코드에서는 들여쓰기 1번 만으로 구현이 가능해야 한다는 내용도 있는데, while 문 내에서 특정 조건일 때 continue 시키는 경우도 가능한지 궁금하다. 좀 더 많은 내용을 보고 학습하면 이렇게 애매한 부분들도 채워지지 않을까? import java.io.BufferedReader; import java.io.IOException; import java.i... Read More
-
[운영체제] Process Scheduling 2 (Synchronize)
Process Scheduling 2 (Synchronize) 이화여대 반효경 교수님의 kocw 운영체제 강의를 들으면서 개인적으로 작성한 내용입니다. 스케쥴링 FCFS(First-come First-service) Round Robin(RR) CPU를 기다리는 시간이 CPU를 사용하려는 시간에 어느정도 비례하는 측면에서 공정한 스케쥴링이라고 할 수 있음. 각 프로세스는 동일한 크기의 할당 시간(time quantum)을 가짐. Process Context를 save하고, CPU를 다시 얻었을 때는 그 지점부터 재개할 수 있는 메커니즘을 제공한다는 ... Read More
-
[Network] 브라우저가 서버와 통신하는 원리
Chap01.웹 브라우저가 메시지를 만든다 성공과 실패를 결정하는 1%의 네트워크 원리 책을 읽고 정리한 글입니다. IP 주소 조회 및 기본적인 네트워크 허브, 라우터는 패킷을 중계하는 장치의 일종이다. 서브넷은 허브에 몇 대의 PC가 묶인 네트워크 단위라고 이해하자. TCP/IP 네트워크는 결국 이 서브넷 들을 라우터로 묶고, 그 묶은 단위를 또 다시 허브로 묶고, 라우터로 반복 중계하는 형태를 띈다. 서브넷과 허브의 관계 (출처: https://nolzaheo.tistory.com/37) IP주소(네트워크 번호 + 호스트 번호)를 통해 데이터를 보내는데, 라우터가 그 방향 쪽 라우터에... Read More
-
[CS] VB Code 실습
웹 개발자를 위한 대규모 서비스를 지탱하는 기술 책을 읽는 중, 압축 프로그래밍 파트에서 간단한 예시로 VB Code(Variable Byte code)를 소개했다. 사실 알고리즘으로도 분류되어서 어느 카테고리에 둘 지 고민했는데, 알고리즘을 공부하다가 정리하게 된 글이 아니므로 CS로 분류했다. 매번 자바를 사용하면서 int는 4바이트, long은 8바이트 정도만 생각했고, 실제로 바이트 단위로 생각해본 경험이 없었다. 대용량의 큰 정수열들을 처리할 때 쓰인다고 하는데 흥미로웠다. 책에 나와있는 Pseudo Code를 기반으로 구현했으며 간단한 파이썬을 이용했다. """ VB Code(Variable ... Read More
-
[Algorithm] Merge Sort (병합정렬)
매번 기본 라이브러리의 sort 함수를 사용했었는데, 기본이 부족한 것 같아서 오랜만에 Merge Sort를 찾아보며 구현했다. 파이썬에서는 전역변수를 통해 편하게 사용하곤 했었는데, 코드의 퀄리티를 고민하다 보니 전역변수는 옳지 않았다. 매개변수는 레지스터를 이용하기 때문에 빠르다 (레지스터 > L2캐시 > 메모리) ARM 64비트 기준 매개변수 6개를 사용할 수 있다. 이보다 더 많이 사용하는 경우가 많을 수 있지 않나? -> 그래서 객체나 자료구조들이 존재하는 것! import java.util.Arrays; public class MergeSort { public st... Read More
-
[PS] 포도주 시식 (백준 2156번)
역시 Dynamic Programming 문제는 점화식을 잘 세우는게 정말 중요하다. 이거에 따라 풀 수 있는 문제인지, 절대 못 푸는 문제인지 정해지니까.. 그리고 무의식적으로 Java로 코테를 준비할 때는 속도를 위해 모든 필드와 메서드를 static으로 선언해서 사용해왔다. 보다 객체지향적으로 짜려고 데이터 입력받는 책임을 수행하는 Reader 클래스를 따로 구현했는데(FastCampus 강의를 수강하며 참고함), 내부 클래스에도 static을 꼭 선언해야 하나 해서 읽던 Effective Java를 다시 폈다. 내부 클래스를 구현할 때는 내부 클래스가 외부 클래스에게 위임하거나 호출하는게 없다면, s... Read More
-
[PS] 암호 만들기 (백준 1759번)
연습 겸 완전탐색 문제를 풀었다가, 생각보다 오래 걸렸다. (조합 때문에) Python 이용할 때는 itertools 내 Combination 라이브러리를 사용할 수 있었는데, java는 직접 구현해야 했다. 물론 어려운건 아니지만, 처음 직접 해봤더니 조금 헤맸다. 조합 기능을 하는 Combination 클래스를 따로 두었고, 문제를 풀었더니 자꾸 틀렸다. 이상해서 자세히 보니 답안 조건에 모음 1개, 자음 2개 이상 포함이 있었다. 이는 isValid() 메서드를 통해 출력 전 검사를 통해 구현했다. (검증은 Combination의 책임이 아니라고 생각해서..) import java.io.Buffe... Read More
-
[PS] RGB거리 (백준 1148번)
쉬운 편에 속하는 DP 문제인 것 같은데, 아주 아주 약간(?)의 발상이 필요한 문제였다. 필기를 통해 충분히 계산하고 코드 작성을 시작하자! import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; /* BOJ no.1149 - RGB거리 (DP) */ public class Main { static int N; static int[] costOfLastRed = new int[1001]; static int[... Read More
-
[PS] DFS와 BFS (백준 1260번)
이전에 풀어본 정말 간단한 DFS/BFS 예제인데, java로 변수명이랑 객체지향 개념을 녹아내려니까 굉장히 오래 걸리고, 풀이 또한 길었다. java로 코테를 볼 때는 최대한 시간 안에 빠르게 문제를 푼 다음, 리팩토링을 하는 방향으로 진행하자. 아직 너무나도 부족해서, 시간이 많이 부족하다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; imp... Read More
-
[PS] 배열 합치기 (백준 11728번)
간단한 투포인터 문제이다. Java로 풀어보았다. 객체지향을 녹여내는건 진짜.. 잘하고 싶다! import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringBuffer buffer = new StringBuffer(... Read More
-
[PS] 음악프로그램 (백준 2623번)
위상 정렬 문제이다. 이번에는 Java로 풀어보았다. 생각보다 변수명을 신경쓰고, 메서드 단위로 쪼개서 구현하는게 쉽지 않다. 특히 객체지향을 녹여내는 건 더욱 그렇다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.StringTokenizer; public class Main { static BufferedRe... Read More
-
[PS] 트리의 부모 찾기 (백준 11725번)
트리의 기본 연습 문제이다. ''' BOJ no.11725 - 트리의 부모 찾기 (트리) ''' import sys ### input sys.setrecursionlimit(100000) N = int(sys.stdin.readline()) tree = [ [] for _ in range(N+1) ] each_parent = [0 for _ in range(N+1)] for i in range(N-1): first_node, second_node = map(int, sys.stdin.readline().split()) tree[first_node].append(second_node) t... Read More
-
[PS] 트리 (백준 1068번)
트리의 기본 연습 문제이다. ''' BOJ no.1068 - 트리 (트리) ''' import sys sys.setrecursionlimit(100000) N = int(sys.stdin.readline()) tree = [ [] for _ in range(N) ] each_parent = [ -1 for _ in range(N) ] count_of_leaf = 0 count_of_removed_leaf = 0 root_node = 51 def clean_of_tree(): global root_node for idx, parent_node in enumerate(list(map(int, sy... Read More
-
[Spring boot] FCM Initializer 실행 안됨
[Spring boot] FCM Initializer 실행 안됨 팀원들이랑 이제 구글 플레이스토어와 애플 앱스토어에 앱을 배포하는 일만 남았는데, 갑자기 FCM 메시지가 작동하지 않았다. 에러 문구: FirebaseApp with name [DEFAULT] doesn't exist 원인을 찾다가 삽질을 굉장히 오래했는데, 서버 로그를 뒤져보니 FCMInitializer가 아예 실행되지 않는 것 같았다. 기존에 FCMInitializer에서 필요한 환경변수를 PropertyUtil 클래스를 통해서 받아왔는데, 확인해보니 환경변수를 읽어오지를 못했다. 스프링 빈 라이프 사이클에 대해서 생각해보니 많이 모르고 ... Read More
-
[JPA] 조회 시 단일 데이터 보장
[JPA] 조회 시 단일 데이터 보장 pk가 아닌 컬럼으로 조회한 경우, 기획한 내용을 바탕으로 생각하면 데이터가 하나가 나와야 하는데 그렇지 못하는 경우가 있다. 예를 들어, 찜한 데이터 목록을 불러올 때, itemId와 userId를 조건으로 쿼리를 날렸을 때 데이터는 한 건이거나 없어야 한다. 하지만, 위 코드를 보면 연관관계가 걸려있을 뿐 어떠한 제약이 걸려있지 않기 때문에 queryDSL이나 JPA Repository 메서드를 사용하면 반환되는 자료형은 List이다. 그래서 unique 제약을 걸 필요가 있을 것 같다. 아래 참고 링크에 단일 컬럼, 이중 컬럼에 대한 unique 제약 조건을 ... Read More
-
Spring-boot JPA/Hibernate N+1 문제 (batch 설정)
N+1 문제 (fetchJoin 관련) 참고 링크 https://pasudo123.tistory.com/426 Item에는 List 를 가지고 있어서 아이템을 여러개 조회할 때 마다 이미지 쿼리가 아이템 갯수만큼 날아감. 근데 배포 서버에도 비슷하게 구현한 경우인데, 이 경우에는 쿼리가 한번 나간다. (아래 이미지) spring: jpa: properties: hibernate: default_batch_fetch_size: 100 위와 같은 설정으로 인해서 Hibernate가 배치 처리를 지원해주는 것 같다. Read More
-
redis 다중 서버 구성 (feat. sentinel)
redis 다중 서버 구성 (feat. sentinel) 참고 https://coding-start.tistory.com/126 https://coding-start.tistory.com/127?category=791662 얘네도 다 해봐야함. Redis - Cluster & Sentinel 차이점 및 Redis에 대해 https://coding-start.tistory.com/128?category=791662 Spring boot, Redis - Spring boot Redis Nodes Cluster ! (레디스 클러스터) ... Read More
-
Spring boot에서 Firebase Realtime DB 접근하기
Spring boot에서 Firebase Realtime DB 접근 https://firebase.google.com/docs/database/admin/start?hl=ko (Java)Spring boot 서버에서 접근할 수 있는 방법은 생각보다 간단했다. 하지만 Realtime Database 특성 상 비동기 리스너를 통해서 데이터를 쓰고, 받아오는 것 같았다. 결국에는 RTDB에 변경사항이 있는 경우 트리거가 요청됨. 따라서, 기존에 채팅방 목록을 API 서버에서 RTDB를 통해 직접 가져오는 방식은 현재로서는 어려울 것 같다. (멘토님께 질문을 드려야 하나?) 비동기 리스너를 통해 채팅 메시지가 ... Read More
-
redis + flask 따라해보기
redis + flask 따라해보기 참고: https://niceman.tistory.com/200 $ sudo apt install python3-pip pip 버전이 너무 낮음 따라서 다시 설치해야 하는데, 파이썬 버전 여러개를 관리하는게 필요할 듯. 여기서 pyenv, virtualenv 이용방법 참고 $ sudo apt install git curl $ curl -L [https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer](htt... Read More
-
알림 데이터 저장소 변경 시 데이터 구조 등 (RDBMS → NoSQL)
알림 데이터 저장소 변경(RDBMS → NoSQL) 기존 RDBMS NoSQL 표시되는 알림 내용 hellodowonkwon님이 "엑소 핸드선풍기" 굿즈에 가격 제안을 했어요. [8000원] 1시간전 userId(receiver):notificationId (senderNickName), (notificationTitle), (notificationType), (<>itemPrice), (notificationCreatedAt) // snapshot = DataSnapshot { key = chatRooms, value = { -Mirjowqjprwqrqwrqw={item={pr... Read More
-
Redis-Server 설치하기 (파일 형태)
redis-server 설치 Ubuntu 18.0.4 (AWS EC2) 기준 ### wget 대신 다운로드 페이지에서 최신 버젼을 직접 받아도 된다 $ wget http://download.redis.io/redis-stable.tar.gz $ tar xvzf redis-stable.tar.gz $ cd redis-stable $ make #출처: #[https://dgkim5360.tistory.com/entry/install-redis-for-linux-or-windows](https://dgkim5360.tistory.com/entry/install-redis-for-linux-or-windows... Read More
-
[Auto-Scailing] AWS 오토스케일링 적용
AWS 오토스케일링 적용 https://hoing.io/archives/3762 기존 CodeDeploy 이용해서배포 시 원래 쓰던 인스턴스는 변경 사항이 반영되지만, 오토스케일링 그룹을 통해 생성된 인스턴스는 적용이 안되었다. CodeDeploy 배포 그룹 속성 편집으로 해결 됨. 대상 인스턴스 에서 대상 오토스케일링 그룹 설정으로! 참고링크 : https://devlog-wjdrbs96.tistory.com/306 Read More
-
Nginx 파일 용량 제한 문제 (CORS)
Nginx 파일 용량 제한 문제 (CORS) 1 MB 이상으로는 파일 전송이 안되는 문제가 있었다. 개발자 도구에는 CORS 에러가 발견되기도 했는데, 찾아보니 Nginx에서 따로 파일 용량제한에 대한 설정을 하지 않았을 때 나오는 에러라고 한다. Ubuntu 18.0 기준 /etc/nginx/nginx.conf 에서 server 탭에 server { .. **client_max_body_size [원하는 용량]; .. }** 추가로 해결되었다. 해결에 참고한 글 https://storyinglass.tistory.com/11 Read More
-
아이템 디테일 조회 API - 가격 제안 표시 포함
아이템 디테일 조회 API - 가격 제안 표시 포함 조회 쿼리 (수정 전) querydsl return queryFactory.select(item, new CaseBuilder().when(userItem.user.id.eq(userId)).then(1L).otherwise(0L).sum().as("isExistOfLike"), new CaseBuilder().when(pricePropose.user.id.eq(userId)).then(1L).otherwise(0L).sum().as("isExistOfPricePropose... Read More
-
아이템 전체 조회 API - 좋아요 표시 관련 N+1
아이템 전체 조회 API - 좋아요 표시 관련 N+1 아이템 전체 조회 API : item 검색(item, idol_member, idol_group, user, category_item, image 연관 관계)과 user_item(좋아요)를 개인화(user_item.user_id)하여 아이템에 좋아요를 했는지 표시하는 기능을 구현해야 했다. 복잡해서 MySQL 기준 쿼리로 먼저 짰다. select ui.item_id, count( if(ui.user_id=<사용자 id>, ui.user_id, NULL)) from user_item ui group by ui.item_id; 문제 상황 :... Read More
-
DB에 데이터 인서트 시 이모지 포함하는 경우 SQL
DB에 데이터 인서트 시 이모지 포함하는 경우 SQLEXECPTION AWS RDS에서 파라미터 그룹의 ‘char’, ‘coll’ 포함한 파라미터들을 각각 utf8mb4, utf8mb4_general_ci로 수정하고 재부팅하면 된다는 해결책이 대부분이었다. 하지만 우리는 이미 배포된 서버에서 테이블, 컬럼을 생성했고 데이터를 넣어서 사용하고 있는 상황이어서 아무리 스키마에 적용이 되었다고 한들 에러가 해결되지도 않았고, 워크벤치에서 직접 입력했을 때도 이모지가 ? 로 표시되었다. 그러다가 아래 참고 링크를 확인했는데, 이미 추가된 테이블과 컬럼들이 있는 경우는 어쩔 수 없이 하나하나 입력해주어야 한다는 내용을... Read More
-
아이템 디테일 API - 좋아요 표시 관련 에러
아이템 디테일 API - 좋아요 표시 관련 에러 문제 상황 : 아이템을 좋아요 요청, 취소한 후 아이템 디테일 페이지 확인 시 아이템 데이터를 불러오지 못함. Sentry.io를 통해서 에러 로그 확인 → querydsl에서 .fetchOne() 호출한 결과가 유니크하지 않다는 에러 **해당 에러 문구** ### **NonUniqueResultException** ``` javax.persistence.NonUniqueResultException: query did not return a unique result: 2 ``` - DB에서 user_item 테이블을 조회해보니, 실... Read More
-
[Spring Boot]멀티 모듈 프로젝트 구성 방법
Spring Boot 멀티 모듈 프로젝트 설정(root, 각 모듈 build.gradle 설정) root 프로젝트의 build.gradle (소스 출처 : https://daddyprogrammer.org/post/13156/spring-boot-change-multi-module/) buildscript { ext { springBootVersion = '2.1.4.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot... Read More
-
[PS] 기둥과 보 설치 (프로그래머스)
[코테]프로그래머스 - 기둥과 보 설치 프로그래머스 lv3_기둥과 보 설치 [2020 KAKAO BLIND RECUITEMENT 기출] 생각보다 하드 코딩하는 부분이 많았다. 완전 하드하게 짰을 때 고치는 과정에서 애먹어서 함수형태로 조금 리팩토링하였고, 그래도 테스트 케이스 반 정도가 오답이어서 질문하기를 참고했다. 가장 많이 도움 된 답변( https://programmers.co.kr/questions/15598 )을 보고 알 수 있었다. 내가 is_available_remove_row(y, x) 에서 row에 의존하는 기둥과 보의 존재를 조건을 주지않고 무조건 설치가 가능한지 체크를 했기 때문에 ... Read More
-
[PS] 자물쇠와 열쇠 (프로그래머스)
[코테]프로그래머스 - 자물쇠와 열쇠 프로그래머스 Lv.3 - 자물쇠와 열쇠 ( 2020 KAKAO BLIND RECRUITMENT ) https://programmers.co.kr/learn/courses/30/lessons/60059 import copy def solution(key, lock): answer = False m = len(key) n = len(lock) map_ = fill_by_zero(lock, m-1, m-1 , 2*(m-1)) solution_lock = [[1 for __ in range(n)] for _ in range(n)] ... Read More
-
[PS] 프로그래머스 - 가장 먼 노드
[코테] 프로그래머스 - 가장 먼 노드 """ 프로그래머스 레벨 3 - 가장 먼 노드 https://programmers.co.kr/learn/courses/30/lessons/49189 """ from collections import deque def solution(n, edge): answer = set() graph = [set([]) for _ in range(n+1)] # edge 기준으로 그래프 만들기 for edge_ in edge: graph[edge_[0]].add(edge_[1]) graph[edge_[1]].add... Read More
-
[AWS, Django] Elastic Beanstalk, RDS 연동하여 배포
[AWS] Elastic Beanstalk, RDS, S3 Elastic Beanstalk, RDS, Django 연동 (+S3) EB, RDS 연동 (보안 그룹 - 인바운드) RDS와 연동하는 과정에서 RDS 인스턴스의 보안 그룹에 Elastic Beanstalk 인스턴스의 보안그룹(sg-…..AWSEBSecurity …. 형태)을 추가해주었는데, 접근이라도 되는게 맞는데 계속 503 error가 발생했다. 이틀 정도를 고생하면서 여러 글들을 봤지만, 해결이 되지 않았다. 그 중 가장 상황에 맞는 해결책은 EB 인스턴스의 Configuration-인스턴스 설정-보안 그룹을 수정하는 것이었다. 인스턴스의... Read More
-
[PS] 순위 검색 (프로그래머스)
문제 링크 순위 검색 (프로그래머스 Lv 2) 문자열 parsing과 dict(해쉬)의 중요성을 다시금 느끼는 문제였다. 느낀 점 파이썬 라이브러리 bisect 이진 탐색을 해주는 라이브러리 bisect.bisect_left(arr, element, (start) ,(end)) arr(오름차순으로 정렬되어 있다고 가정)에 element를 넣는다면 어디에 위치할 지 index를 반환함. element 보다 작은 원소 뒤에 위치(element와 같은 원소보다는 앞(왼쪽)에 위치함) bisect_right() 는 eleme... Read More
-
[Django] python3 manage py test
INSTALL_APPS 에 등록을 하지 않은 APP에서의 test 파일들도 실행시킨다. ‘test’ 로 시작하는 파일들을 test파일이라 간주하고 실행시킨다. atests_all.py 파일은 실행시키지 않지만, tests_all.py 파일은 실행시킨다. 모듈 설치 pip3 install pytest pip3 install pytest-django pip3 install pytest-cov pip3 instasll ipdb (테스트 코드에 브레이킹 시켜서 디버깅 기능 제공) class PostsBaseTest(TestCase): # model test def test_c... Read More
-
[Django] profile(detail, update, changepassword) 구현
user profile page 구현 django.views.generic.DetailView 제네릭 뷰(DetailView)를 통해 구현. 사용한 속성 - model, template_name, context_object_name context_object_name의 default는 ‘object’인데, template 에서 해당 객체를 호출할 때 쓸 변수명이다. {{context_object_name(default='object')}} 로그인해서 접속해 있는 유저와 보고있는 프로필 페이지 주인인 유저를 비교할 때 사용함 ({% if user == user_obj %}) update us... Read More
-
[PS] 가장 큰 정사각형 찾기 (프로그래머스)
가장 큰 정사각형 찾기 (프로그래머스 Lv 2) 문제 링크 나는 일단 마땅한 풀이가 떠오르지 않아, brute force로 우선 접근했다. max_length = 주어진 2차원 배열에서 만들 수 있는 최대 정사각형의 변의 길이 첫번째 풀이 while max_length > 0: for i in range(height - max_length): for j in range(width - max_length): # 구현 .. max_length -= 1 height과 width 값에서 max_length를 뺀 것만큼 반복하고, max_length를 줄여나가는 식으로 반복을... Read More
-
[Django] Paginator (django.core.paginator)
from django.core.paginator import Paginator paginator = Pagenator(`query_set`, `per_page`, `orphans`) 마지막 페이지에 오는 리스트들을 orphans 라고 하는데(orphans_num < per_page), orphans 를 설정해주면 마지막 페이지 이전 페이지에 orphans들을 포함시켜서 per_page 를 초과하여 출력해줌. Paginator.page(page_num=..) 에러를 좀 더 컨트롤 할 수 있다. Paginator.get_page(page_num=..) 에러 컨트롤이 적음. (쿼리스트링으로 nu... Read More
-
[Java의 정석 I] 배열, 객체지향 프로그래밍 I
1권 - Chapter 5 ~ 6 Chapter 5. 배열 for 문을 통해 배열을 복사하는 것 보다, System.arraycopy() String 클래스는 char 배열에 기능(메서드)을 추가한 것이다. 문자열을 단순히 문자의 배열로 정의하지 않고 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위해서이다. char 배열과 String 클래스의 한가지 중요한 차이가 String 객체는 read만 가능하고, 내용을 변경할 수는 없다. 변경 가능한 문자열을 다루려면 StringBuffer 클래스를 사용하자. JVM은... Read More
-
[Django] urls, render(template) 기능
Django urls.py 를 통해서 url 매핑 config/urls.py 에서는 include()를 통해 각 앱의 urls.py 들을 읽어들임. from django.contrib import admin from django.urls import path, include urlpattrerns= [ path("", include("core.urls", namespace="core")), path("admin/", admin.site.urls), ] templates를 사용하려면 settings.py 의 TEMPLATES의 DIR에 경로를 추가해줘... Read More
-
[CNN]용어학습
CNN(Convolutional Neural Network) : 이미지의 공간 정보를 유지한 상태로 학습이 가능한 모델 추출한 이미지의 특징을 모으고 강화하는 Pooling 레이어 필터를 공유 파라미터로 사용한다. 그래서 일반 인공 신경망과 비교하여 학습 파라미터가 매우 적음. CNN은 이렇게 나눌 수 있다. CNN = Feature extraction + Classification (이미지의 특징을 추출하는 부분 + 클래스를 분류하는 부분) Feature extraction Convolution Layer와 Pooling Layer를 여러 겹 쌓는 형태로 구성됨. Convolution La... Read More
-
[Deep learning]Introduction of AI and Machine learning
인공지능과 기계학습 소개 일상 속 인공지능 음성인식 (Siri) 추천 시스템 (eBay, Netflix) 자율주행 (Waymo) 실시간 객체 인식 (Face ID) 로봇 (HUBO) 번역 (papago) 강의에 사용되는 도서들은 다음과 같다. 기본도서 : 기계학습, 오일석 참고도서 Machine Learning: a Probabilistic Perspective by K. Murphy Deep Learning by Goodfellow, Bengio, and Courville Stanford CS231N 강의자료 기계... Read More
-
[ML_basics]Linear models for classification
이론 적인 부분이 대부분이라 타이핑으로 학습기록 남기기가 어려워서 자필로 필기한 내용을 남긴다. Read More
-
[ML_basics]Linear Regression
이론 적인 부분이 대부분이라 타이핑으로 학습기록 남기기가 어려워서 자필로 필기한 내용을 남긴다. Read More
-
[ML_basics]probability distribution
이론 적인 부분이 대부분이라 타이핑으로 학습기록 남기기가 어려워서 자필로 필기한 내용을 남긴다. Read More
-
[5th_week_proj]Django deploy using uWSGI, Nginx at Ubuntu
Ubuntu 환경에서 uWSGI, Nginx를 사용해서 Django 프로젝트 배포하기 Wsgi, 웹 서버 게이트웨이 인터페이스) (파이썬에서는 Uwsgi라고 함) 소켓이 자동 생성되는데, 요청이 들어왔을 때 자동으로 연결해주는 역할(?) Nginx 와 연결다리 역할(?) 이 유튜브 영상을 참고하였다가 미친듯한 에러들을 겪었다. 에러문구 2020/12/31 18:15:12 [error] 5214#5214: *1 upstream prematurely closed connection while reading response header from upstream, client: 221.151.46.23... Read More
-
[python_base64]How to use base64
python - base64 모듈 사용법 b = s.encode("UTF-8") 문자열 → 바이트 변환 e = base64.b64encode(b) 바이트 → base64 바이트 변환 s1 = e.decode("UTF-8") base64 바이트 → base64 문자열 변환 b1 = s1.encode("UTF-8") base64 문자열 → base64 바이트 변환 d = base64.b64decode(b1) base64 바이트 → 바이트 변환 m = base64.b6... Read More
-
[django_pandas_error]html이 텍스트 그대로 출력되는 문제
문제점 pandas 이용해서 데이터 csv 파일을 불러오고, html에 표현하기 위해 dataframe 형태에 .to_html() 을 사용해서 html 코드를 head 변수에 담아서 템플릿에 변수로 넘겨줬다. # views.py # from django.shortcuts import render import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from pathlib import Path import os BASE_DIR = Path(__file__).resolve().parent.parent... Read More
-
[4th_week-day4]Django으로_동적_웹_페이지_만들기
models.py : DB 테이블과 매칭되는 객체를 선언(ORM 방식) model class들을 만들어놓은 상태에서 python manage.py makemigrations <app_name> (마치 git add)을 해줘야 장고에서 class들을 migration으로 등록해준다. 이후 python manage.py migrate(마치 commit, push)를 하여 실제 DB에 반영하는 작업을 진행한다. from django.db import models # Create your models here. class Coffee(models.Model): def __str__(sel... Read More
-
[4th_week-day3]Web_Application_with_Django
4th week - 라이브 세션 **get_json() 메서드의 정체 → 딕셔너리 형태로 access** HTTP 프로토콜 상에서 바디에 담겨있는 JSON은 “문자열” 취급된다. JSON 형태의 문자열 → 파이썬의 딕셔너리 변환 flask의 app 이름은 반드시 app.py 여야 하는가? flask run 명령을 실행하면 FLASK_APP 변수에 담긴 파일명을 실행 만약 해당 파일이 없다면 app.py 를 default로 찾고, 그것도 없으면 에러 발생 Django 의 MVT 패턴 Model, View, Template 으로 구성 일반적인 MVC 패턴에서의 Control... Read More
-
[4th_week-day2]클라우드_활용_머신러닝_모델_Serving_API_개발
클라우드 기초 IDC(Internet Data Center) 서버 운영에 필요한 공간, 네트워크, 유지 보수 등의 서비스를 제공 효율적인 자원과 적은 비용으로 사용할 수 있엇지만, 대부분의 IDC의 서버 임대는 계약을 통해 일정 기간 임대하는 유연성이 떨어지는 구조이다. Cloud Computing의 장점? 4차 산업혁명 시대에서 빅데이터의 수집, 저장, 분석을 위한 방대한 컴퓨팅 자원과 인공지능 개발을 위한 고성능 컴퓨터를 사용할 수 있는 IT 환경이 마련하다. 속도 접근성 확장성 생산성 보안, 안정성 측정가능성 운용 모델 ... Read More
-
[4th_week-day1]Web Application with Flask
Web Application with Flask Flask 활용 REST API 구축 Django 활용 웹 사이트 구축 Flask Python 기반 마이크로 웹 프레임워크 # (venv) # 가상환경 진입 후 pip freeze # 설치된 모듈들을 보여줌 pip install flask # flask 설치 REST API (Representational State Transfer) "웹 서버가 요청을 응답하는 방법론 중 하나" - 데이터가 아닌, 자원(Resource)의 관점으로 접근 HTTP URI를 통해 자원을 명시 HTTP Method 를 통해 해당 자원에... Read More
-
[3rd_week-day3]Python으로 데이터 다루기 Ⅱ - seaborn
Seaborn Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리 커널밀도그림 카운트그림 캣그림 스트립그림 히트맵 Seaborn Import 하기 import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns 커널밀도그림 (Kernel Density Plot) 히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림 sns.kdeplot() # in Histogram x = np.arange(0, 22, 2) y = np.random.randi... Read More
-
[3rd_week-day3]Python으로 데이터 다루기 Ⅱ - matplotlib
1. Matplotlib 시작하기 파이썬의 데이터 시각화 라이브러리 %matplotlib inline을 통해서 활성화 cf) 라이브러리(numpy, pandas, ..) vs 프레임워크(django, ..) import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline 2. Case Study with Arguments plt.plot([1,2,-3,4,-5]) # 실제 plotting 하는 함수 plt.show() # plt를 확인하는 명령 Figsize : Figure(도면)의 크기 ... Read More
-
[3rd_week]jupyter notebook 실행 에러
노트북에서는 cmd에 ‘jupyter notebook’ 명령어로 jupyter notebook이 실행되었는데, 데스크탑에서는 계속 'jupyter'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라는 오류가 떴다. 찾아보니 환경변수 문제인 것 같은데, 대부불 conda를 이용해서 설치한 경우라 pip install 했을 경우 환경변수 설정 방법을 찾기 힘들었다. 그런데 해당 명령어 대신 ‘python -m notebook’ 을 사용하라는 글을 봤다. 이게 해답인 것 같다. (왜 인지는 아직 모르겠다..) Read More
-
[3rd_week-day2]Python으로 데이터 다루기 Ⅱ - pandas
Pandas Prerequisite : Table 행과 열을 이용해서 데이터를 저장하고 관리하는 자료구조(컨테이너) 주로 행은 개체, 열은 속성을 나타낸다. Pandas 시작하기 import pandas 를 통해서 진행 import pandas as pd Ⅱ. pandas로 1차원 다루기 - Series Series? 1-D labeled array 인덱스를 지정해줄 수 있음 s = pd.Series([1,4,9,16,25]) s 0 1 1 4 2 9 3 16 4 25 dtype: int64 t = pd.Series({'one':1, '... Read More
-
[3rd_week-day1]Python으로 데이터 다루기 I - numpy
Git 기초 git init git add <file_name> # 파일을 깃에 추가 (unstaged -> staged 상태) git status git commit -m "커밋 메시지" 에러 경우 git add 시 “warning: :LF will be replaced by CRLF in example.py. The file will have its original line endings in your working directory” 오류가 발생했다. 이에 대한 해결방법은 https://blog.jaeyoon.io/2018/01/git-crlf.html 에 나와있다. ... Read More
-
[2nd_week-day5]추정,검정,엔트로피
표본 분포 전수조사는 실질적으로 불가능한 경우가 많으므로 표본 조사를 통해 모집단에 대한 해석을 진행하는 통계적 추론을 이용한다. 표본 조사는 반드시 초차가 발생하기 때문에 적절한 표본 추출 방법이 필요하다. (표본과 모집단과의 관계 이해가 기반이 되어야 함) 랜덤넘버 생성기 (python) import random [random.randint(1,10) for i in range(10)] 표본 평균의 분포 표본조사를 통해서 파악하고자 하는 정보는 모수(parameter)이다. 모수 - 모평균, 모분산, 모비율 등.. 통계량(statistic) : 표본의 특성값(표본 평균, 표본 분산 등..)... Read More
-
[2nd_week-day4]확률과 확률분포
확률 상대도수를 이용한 확률 똑같은 실험을 무수히 많이 반복할 때 어떤 일이 일어나는 비율 (예를 들면, 다음날 비가 올 확률) 고전적인 확률의 정의를 사용하여 계산할 때는 표본 공간의 모든 원소가 일어날 확률이 같은 경우에만 사용 가능하다. (예를 들어, 날씨의 경우에는 계절에 따라 비가 올 확률이 다르므로 해당되지 않는다.) 덧셈 법칙 $P(A\cup B) = P(A)+P(B)+P(A\cap B)$ 서로 배반 두 사건의 교집합이 없는 경우 조건부 확률 A 사건이 일어났을 때, B 사건이 발생할 확률 $P(B|A)={P(A\cap B)\over P(A)}$ 곱셈 법칙 $P(... Read More
-
[2nd_week-day2]미적분
행렬분해(matrix decompositiion) LU 분해(LU decomposition) QR 분해(QR decomposition) 특이값 분해(SVD, Singular Value Decomposition) LU 분해(LU decomposition) ⇒ 주어진 행렬을 L(Lower triangular), U(Upper triangular) 곱의 형태로 분해(PLU 분해) 역행렬을 통해 해를 구하는 것보다 수치적 안정성이 좋고, $Ax = b$ 에서 $b$가 변동이 자주 있는 경우가 많다. 이때, 업데이트 마다 해를 실시간으로 구할 수 있음. *행렬의 곱은 병렬처리(parallel ... Read More
-
[2nd_week-day1]선형대수
참고) 선형대수는 Python의 Numpy 패키지를 사용한다. 선형시스템 선형 시스템 $Ax = b$ 는 세가지 경우로 나눌 수 있다. 해가 하나인 경우(unique solution) ······ 1 해가 없는 경우(no solution) ······ 2 해가 여러개인 경우 (infinitely many solutions) ······ 3 2번과 3번(역행렬이 없는 경우)의 경우는 Singular(특이) 하다고 함. 1번이나 3번의 경우는 Consistent 하다고 표현하고, 2번의 해가 없는 경우는 Inconsistent 하다고 한다. 임의의 $m×n$ 선형시스템의 해를 구하는 가... Read More
-
[1st_weekend]다익스트라_우선순위큐
프로그래머스 - Lv.3 배달 문제를 푸는 과정에서 학습한 내용 다익스트라 알고리즘 개념 BFS VS 다익스트라(Dijkstra) 차이점 Python에서 우선순위 큐(Priority Queue) 사용법 최소 힙(min heap) VS 우선순위 큐(Priority Queue) 차이점(이걸 학습했다고 해야하나 애매하긴 하지만..) 문제는 간략하게 말하면, 시작 노드에서 모든 노드에 최단 시간(거리)의 경로로 탐색했을 때 조건으로 주어진 시간 내에 도착할 수 있는 노드의 개수를 구하는 것이다. BFS를 떠올렸지만, BFS에 대한 이해가 부족해서인지 응용은 쉽지 않았다.(방문한 노드에 대한 방문... Read More
-
[1st_week-day4]힙_동적계획법_DFS_BFS_문제풀이
파이썬에서 힙(라이브러리)을 사용하는 방법 import heapq heapq.heapify(L) # L(리스트)로부터 min heap을 구성한다. m = heapq.heappop(L) # min heap인 L에서 최소값을 삭제하고 반환한다. heapq.heappush(L,x) # min heap인 L에 원소 x를 삽입한다. *힙 자료 구조는 [1st week-day2] 참고 동적계획법 (Dynamic Programming) ⇒ 알고리즘이 진행되면서 탐색해야 할 범위를 동적으로 결정하며 탐색 범위를 한정할 수 있다. 동적계획법이 적용된 대표적인 좋은 문제는 “배낭 문제(Knapsack prob... Read More
-
[1st_week-day3]해쉬_그리디_소트_문제풀이
d[x] = d.get(x, 0) + 1 # 사전에 대해 x가 존재하면 해당 key에 해당하는 값을 반환, 없다면 0 반환 # dictionary.get() 탐욕법 (Greedy Algorithm) ⇒ 현재 선택이 마지막 해답의 최적성을 해치지 않을 때 적용 가능하다. Read More
-
[1st week-day2]큐_트리_힙
큐(Queue) 배열로 구현한 큐 양방향 연결리스트로 구현한 큐 큐 활용 자료를 생성하는 작업과 그 자료를 이용하는 작업이 비동기적으로 (asynchronously) 일어나는 경우 (ex. Producer 에서 자료를 생성하여 큐에 쌓아놓고, Consumer들이 하나씩 꺼내서 사용함) 자료를 처리하여 새로운 자료를 생성하고, 나중에 그 자료를 또 처리해야 하는 작업의 경우 환형 큐(Circular Queue) 정해진 개수의 저장 공간을 빙 돌려가며 이용 (큐를 배열로 구현한 경우, 큐의 길이에 비례해서 데이터를 추출하는데 시간이 오래 걸리는 점을 개선한 형태) ... Read More
-
[1st week-day1]배열_재귀_연결리스트_스택
재귀 알고리즘 Recursive version VS Iterative version 둘 다 O(logn) 이지만, 재귀는 함수를 호출하고 반환하는 데 드는 시간 때문에 효율성 측면은 반복이 좀 더 좋다. 연결 리스트(Linked List) 장점 : 삽입, 삭제가 용이하다 스택(Stack) 스택 언어플로우 : 스택이 비어있는데 데이터를 pop() 하려고 할 때 발생 스택 오버플로우 : 꽉 차있는 스택에 데이터를 삽입하려고 할 때 발생 배열로 구현한 스택 DoublyLinkedList로 구현한 스택 Read More
-
[CS]Stack_VS_Heap
Stack VS Heap 개념을 까먹었고 오해하고 있어서 정리 파일을 만들었다. 메모리 구조 (from CS50 Lecture) Machine Code 머신 코드 영역에는 프로그램이 실행될 때, 해당 프로그램이 컴파일 된 바이너리 코드가 저장된다. Stack RAM(Random Access Memory) 영역 중 각 함수의 지역변수들을 LIFO(Last In First Out) 방식으로 저장하는 영역이다. (Java에서는 heap 영역에 생성된 Object 타입의 데이터들에 대한 참조값들이 할당됨. 원시타입의 데이터들은 실제 값 할당.) 함수가 종료되면 스택에서 해당 함수가 pop() 되어지고, ... Read More
-
[JPA]객체지향_쿼리_언어1 - 기본 문법
*본 포스트는 김영한님의 “자바 ORM 표준 JPA 프로그래밍 - 기본편” 을 수강하며 학습을 기록하는 내용입니다. 소개 다양한 쿼리 방법 지원 JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 대부분의 경우 JPQL로 해결됨 EntityManager.find() 객체 그래프 탐색 나이가 18살 이상인 회원을 모두 조회하고 싶다면? JPA는 엔티티 객체를 중심으로 개발해야 함. 검색 시에도 테이블이 아닌 객체로 변환해서 검색하는 것은 불가능하다. 데이터에서... Read More
-
[JPA]값 타입
값 타입 종류 기본값 타입 임베디드 타입 컬렉션 타입 기본값 타입 절대 공유 X, 기본 타입은 항 값을 복사한다. Integer타입 같은 래퍼 클래스나 String 타입은 특수한 클래스는 공유 가능하지만 변경이 안되도록 막아야 한다.(Side Effect 방지) 임베디드 타입 (복합값 타입) 주로 기본 값 타입을 모아서 만듬 테이블은 하나인데, 속성들을 그룹화해서 클래스를 설계할 수 있다. 사용법 @Embedded // 사용하는 곳에 사용 @Embeddable // 정의할 때 사용 /** 기본 생성자 필수 **/ 장점 : 재사용, 높은 응집도, 해당 값타입만 사용하는 의미 ... Read More
-
[JPA]프록시와 연관관계 관리
[JPA] 프록시와 연관관계 관리 김영한 님의 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’ 강의 中 프록시 => 프록시란 가짜 객체 (실제 객체를 감싸고 있는 껍데기라고 이해하자) em.find(Member.class, memberId) // 실제 객체 조회 em.getReference(Member.class, memberId) // 가짜(프록시) 엔티티 객체 조회 프록시 동작 원리 프록시 특징 프록시 객체는 첫 사용 시 한 번만 초기화 초기화 시 프록시 객체가 실제 엔티티가 되는 것은 아니다. 프록시 객체 통해서 실제 엔티티에 접근이 가능한 것 프록시 객체는 원본... Read More
-
[JPA]고급매핑
[JPA] 고급 매핑 김영한 님의 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’ 강의 中 상속 관계 매핑 관계형 DB는 상속 관계 매핑이 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다. 상속관계 매핑 : 슈퍼타입 서브타입 관계와 객체의 상속을 매핑함 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 => 조인 전략과 단일 테이블 전략 사이 Trade-Off 를 따져서 엔티티를 설계 @Inheritance(strategy=InheritanceType.XXX) @DiscriminatorColumn : 부모 테이블에 DTYPE 컬럼 만들어줌 (... Read More
-
[JPA]연관관계_매핑_기초
[JPA] 연관관계 매핑 기초 김영한 님의 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’ 강의 中 객체와 관계형 데이터베이스 모델링의 차이 과 사이의 큰 간격을 인지하는 것이 중요..! 아래 두개의 코드 블럭을 통해 차이를 느낄 수 있다. ```java /** 객체를 테이블에 맞추어서 모델링 했을 경우 */ @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") ... Read More