본문 바로가기
[회고] Pre Project를 마치고 드디어 Main Project 들어가기 전에 진행한 Pre Project가 끝났다. 전반적으로 재밌게 진행했다. 프로젝트 초반에는 머릿속에 그림이 그려지지 않아서 헤매기도 하고 고민도 많았다. 하지만 점점 진행하면서 정리가 되어 팀원들과 같은 그림을 공유하면서 프로젝트를 진행할 수 있어서 프로젝트의 재미를 느낄 수 있었다. 완성하지 못하거나, 시도도 못해본 기능들이 여럿 있지만 메인 프로젝트 때 최대한 완성도 높은 프로젝트를 만들고 싶다. 팀원들보다 한 발자국만 먼저 가면서 프로젝트를 올바른 방향으로 이끌어 보고 싶다. 개인 회고 좋았던 부분 서버 환경 구성하면서 포트 포워딩, DMZ 설정을 경험할 수 있었고, 네트워크에 대한 전반적인 이해를 할 수 있었다. AWS 배포 환경을 처음부터 끝까지 설정하면서.. 2022. 9. 10.
포트포워딩 설정으로 테스트 서버를 만들다. AWS에 배포하기 전에 테스트 서버가 필요했다. 프론트 팀원들이 API를 테스트 해야했기 때문이다. 처음엔 어떻게 해야할지 몰랐는데 찾아보니 포트포워딩이나 DMZ 설정으로 내 로컬 컴퓨터를 서버 컴퓨터로 만들어서, 외부(프론트 쪽)에서 접근이 가능하게 할 수 있었다. 포트포워딩 - 외부에서 현재 내 컴퓨터로 접근이 가능하게 하는 설정 - 외부 IP의 특정 포트를 하나의 내부 IP의 특정 포트랑 mapping하는 설정이다. 이를 통해서 테스트 서버 뿐만 아니라, 프론트 팀원과 실시간으로 소통하면서 설정을 이리저리 바꿔가면서 같이 기능을 테스트할 때에도 유용했다. 이를 테면, 프론트 팀원과 쿠키/세션을 이용한 로그인 구현을 할 때가 있었다. 응답 헤더에 Set-Cookie 헤더는 잘 넘어갔지만 브라우저가 이.. 2022. 8. 31.
Auditing 기능 적용 프로젝트에 쓰이는 모든 엔티티에 생성일자시간, 마지막 수정일자시간 컬럼이 필요하다. 그래서 이를 추상 클래스에 필드로 선언한 후 이를 상속하도록 했다. Spring Data가 제공하는 Auditing 기능을 활용했다. Auditable 클래스 @Getter //테이블을 매핑하지 않고, 하위 클래스에 매핑 정보만 제공하기 위해 @MappedSuperclass //Entity가 DB에 저장되기 전후에 커스텀 로직을 선언! //AuditingEntityListener 클래스 내부 @CreatedDate, @LastModifiedDate 등을 탐색해 자동 업데이트 @EntityListeners(AuditingEntityListener.class) public abstract class Auditable { @C.. 2022. 8. 31.
제약 (Constraint) 주로 열에 저장되는 데이터들을 제어하는 규칙을 정의하는 것을 제약이라고 한다. 제약은 데이터의 무결성을 유지하기 위해 필요하다. 데이터의 정확성, 일관성을 유지하는 것을 데이터의 무결성이 유지된다고 생각하면 된다. 데이터의 무결성은 데이터의 가치, 신뢰성면에서 꼭 필요한 속성이다. 제약은 컬럼 레벨과 테이블 레벨로 테이블 생성 시 줄 수 있다. 제약의 종류는 다음과 같다. NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT NULL CONSTRAINT NOT NULL 제약은 특정 열이 NULL값을 가지지 못하도록 하는 제약이다. CREATE TABLE student ( ..., student_name VARCHAR(20) NOT NULL, student_age.. 2022. 8. 14.
[2022 OSSCA] Mideterm Recap 오늘 2022 오픈소스 컨트리뷰션 아카데미 중간공유회가 있었다. 7월부터 한 달간 진행한 Challenges 기간이 끝나고, 그 동안 팀별로 활동한 내역과 앞으로 진행할 계획을 발표하는 시간이었다. 그래서 내가 속해있는 Zeppelin팀도 한 달간 멘티들이 활동한 내용을 정리하고, 또 남은 Masters 기간 동안 어떤 컨트리뷰션이 진행될지 PPT로 정리했다. 한 달간 총 31건의 이슈가 있었고, 그 중 19개의 PR이 merge 되었다. Zeppelin에서 사용하는 여러 인터프리터 중 업데이트가 오래된 인터프리터를 제거하거나 버전 업데이트를 진행했고, Zeppelin이 Mac, Linux 위주로 개발이 진행되어 Windows 환경에서 발생한 여러 이슈를 해결했고, 그 외에 Documents를 수정하는 .. 2022. 8. 13.
(MySQL) INNER JOIN INNER JOIN //두 query의 결과는 같다. //INNER JOIN 사용 SELECT * FROM product INNER JOIN ordering ON product.product_id = ordering.product_id; //INNER JOIN 사용x SELECT * FROM product, ordering WHERE product.product_id = ordering.product_id; EQUI JOIN, NON-EQUI JOIN, NATURAL JOIN 1. EQUI JOIN 일반적인 INNER JOIN 형태로 두 테이블에서 기준 컬럼의 로우값이 같은 로우 반환 JOIN 조건 절에 EQUAL 연산자(=)로 연결 주로, Primary key와 Foreign key 컬럼이 조인할 때 .. 2022. 8. 12.
안정적인 문자열 - 백준 4889 (Java) https://www.acmicpc.net/problem/4889 풀이 1. { 는 stack에 넣는다. 2. } 일 때는, stack이 비어있을 때는 count+1을 하고 { 로 바꿔서 stack에 넣어준다. stack이 비어있지 않을 때에는 stack에 저장된 { 을 pop하여 짝을 짓는다. 3. 모든 과정을 마친 후, stack에 남은 { 의 갯수의 절반을 count에 더해준다. 4개가 남았다면 2개를 } 로 바꿔주면 안정적인 문자열이 되기 때문이다. 즉, stack이 empty하게 만드는 것이다. count() private static int count(Stack stk, String str) { int answer = 0; int length = str.length(); for (int i =.. 2022. 8. 11.
문자열 압축 - 프로그래머스 (Java , Level 3) 처음 풀이 1. 단위를 1 ~ 전체길이의 절반까지 1씩 증가하면서 압축한다. 2. 압축된 최소 길이만 구하면 되기 때문에, 단위 크기로 자른 후 앞과 같은지 다른지 비교 후, 같으면 갯수를 1 증가, 다르면 현재까지 같았던 갯수의 자릿수와 단위 크기를 더해준다. solution() public int solution(String s) { int length = s.length(); //길이가 1일 땐 1 리턴 if (length==1) return 1; int min = Integer.MAX_VALUE; //절반 길이까지 단위 크기를 늘려가면서 압축 길이 갱신 for (int i = 1; i 2022. 8. 10.
스킬트리 - 프로그래머스 (Java, Level 2) https://school.programmers.co.kr/learn/courses/30/lessons/49993 처음 풀이 public int solution(String skill, String[] skillTrees) { char[] charArr = skill.toCharArray(); //skill 탐색 위한 index (index+1부터) int index = -1; int cnt = 0; //선행 스킬에 포함되지만 순서 맞지 않는 경우, //연산을 빠져나오기 위한 flag boolean check = true; for (String skillTree : skillTrees) { //새 skillTree마다 check, index 변수 초기화 check = true; index = -1; in.. 2022. 8. 5.
땅따먹기 - 프로그래머스 (Java, Level 2) https://www.acmicpc.net/blog/view/109 각 행에서 이전 행의 최댓값인 열을 제외한 나머지 3열 중 최댓값을 선택하면 될 줄 알았다. 하지만, 이전 행의 최댓값인 열과 현재 행의 최댓값인 열이 같을 경우, 이전 행의 선택을 바꾸는 것과 현재 행의 선택을 바꾸는 것은 총합의 차이를 가져온다. 즉, 현재의 선택이 매번 계속 다음 선택에 영향을 미친다. 그래서 다음 생각은 모든 경우를 고려하는 dfs를 생각했다. 하지만 행의 수가 100,000까지 가능했기 때문에 아니나 다를까 런타임 에러가 났다. PriorityQueue pq= new PriorityQueue(Collections.reverseOrder()); boolean[] isUsed = new boolean[4]; publ.. 2022. 8. 5.