프로젝트에서 조회수 기능을 구현해야 했다.처음에는 단순하게 조회수 컬럼을 게시판 테이블에 추가하여, 게시글을 조회할 때마다 조회수를 1씩 증가시키는 방식으로 설계했다. 예를 들면 다음과 같은 구조다. @Entitypublic class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; private int views; public void increaseViews() { this.views += 1; }}그래서 GET 요청이 올 때마다 조회수를 단순히 증가시키는 접근으로..
💻개발
계층 구조에 대한 DB를 찾다가 알게 된 구조흔히 사용하는 인접리스트가 있는데 DB에서 자식만 가져오는 것이 아닌 자손까지 가져온다고 했을 때, 계층이 너무 깊으면 self join을 많이해서 쿼리 구조가 복잡하다는 단점이 있다. 그래서 다른 방법을 찾다가 여기까지 왔다. 자기 자신을 포함해서 자식 노드를 모두 저장하는 DB 형태 예를 들어 계층구조가 이런 형태면 DB형태가 ancestor, descendant, length가 저장이 된다. length는 우리가 dfs를 풀 때 depth를 사용하는데 이와 같다고 생각하면 될 것 같다. 그래서 만약 내가 조상일 때 ancestor=1일때라는 조건을 걸어서 select를 하면 되니까 자손을 모두 가져오기도 편하고자식을 가져올 때도 depth=1이라는 조..
언제 발생?1:N, N:1, 양방향 관계 내 경우는?나의 경우 user, userinfo를 1:1 양방향으로 해놓았는데 여기서 문제 발생 문제 해결 방법1. @JsonManagedReference와 @JsonBackReference를 사용@JsonManagedReference를 부모 클래스, 연관 관계 주인의 반대편@JsonBackReference를 자식 클래스, 연관 관계의 주인(외래 키가 있는 곳)에 붙인다. 2. DTO를 객체를 만들어서 반환한다. -> 선택!-> 이걸로 시도해서 해결-> 사실 DTO를 만들어야 해야하는데, 비즈니스 로직 같은 복잡한 코드는 없고 순수하게 전달해야할 때 사용한다~라고만 알고 있었다. 개념만 알고 있었는데 실제 사용해야하는 이유를 알게 되었다.
🐛문제Test에 아래와 같은 코드를 작성했다. @DisplayName("updateArticle : 블로그 글 수정에 성공한다.")@Testpublic void updateArticle() throws Exception {} 원래라면 실행탭에 `updateArticle : 블로그 글 수정에 성공한다.`라는 글이 떠야 하는데 아래 사진과 같이 아무것도 뜨지 않았다! 🛠️ 해결 방법1. `File` -> `Settings` -> `Build, Execution, Deployment` -> `Build Tools` -> `Gradle`2. `Gradle Projects` -> `Run tests using`에서 기존에 `Gradle` -> `IntelliJ IDEA`로 바꾼다. 수정했더니 아래와 같..
🐛문제`@AllArgsConstructor`, `@Getter` 등 롬복을 인식 못하는 오류가 생겼다. 🛠️ 해결 방법1. Lombok 의존성 확인프로젝트에서 gradle을 사용해서 build.gradle을 확인했다. dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'} 2. IDE Lombok 플러그인 확인1. `File` -> `Settings` -> `Plugins`Lombok 플러그인이 설치되어 있는지 확인2. `File` -> `Settings` -> `Build, Execution, Deployment` -> `Compiler` -> `Annot..
1. EC2 인스턴스 생성 TEST용으로 간단한 EC2를 만들어보자. 키 페어는 설정해주고 나머지 옵션은 default로 둔다. 키 페어 생성 방법 더보기 키페어가 없다면 하나 만들어주자. 있다면 기존 걸 선택해도 괜찮다. 나는 `새 키 페어 생성`을 눌러 키 페어를 생성하겠다. `키 페어 생성` 클릭 2. PuTTY 다운 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html Download PuTTY: latest release (0.80) This page contains download links for the latest released version of PuTTY. Currently this is 0.80, released on 202..
인강들으면서 Cloudwatch를 실습했는데, 윈도우라 안 되는 부분이 있었다. 그런데 내가 구글링을 잘 못하는 건지 관련된 자세한 글이 없어서 까먹을까봐 포스팅한다. 1. EC2 인스턴스 생성 Test용으로 만들거니까 정말 단순한 EC2 인스턴스를 만들어보자 좌측 탭의 `인스턴스` > `인스턴스` 클릭 `인스턴스 시작` 클릭 참고로 지역은 서울로 설정함 이름 설정해주기 나머지는 다 default로 해주고 키페어도 설정해주고 인스턴스를 생성하자! 키페어 생성 방법 더보기 키페어가 없다면 하나 만들어주자. 있다면 기존 걸 선택해도 괜찮다. 나는 `새 키 페어 생성`을 눌러 키 페어를 생성하겠다. `키 페어 생성` 클릭 방금 인스턴스를 만들어서 텅텅 비었다. 이제 여기에 Local PC에 있는 파일을 전송해..
보안 그룹을 삭제하려고 하니까 안 됌? 왜지? ec2인스턴스랑 rds인스턴스 모두 삭제되었는데? 이유를 보면 그 원인을 알 수 있다. 1개의 보안 그룹이 연결되어있습니다. 이 경우 기본 보안 그룹이나 다른 보안 그룹이 해당 보안 그룹을 참조하고 있는 경우 라는 것을 알게 되었다. 참조는 보안 해당 보안그룹의 인바운드 및 아웃바운드 규칙을 살펴보면 된다. 둘 다 삭제하고 규칙 저장을 눌러주었다. 그러니 다시 삭제를 할 때 해당 창이 뜨고 잘 삭제가 되었다.
프로젝트를 정리하다가 갑자기 특정 repository에서 `button`이라는 코드가 들어간 파일을 찾고자 했다. 물론 프로젝트를 클론받아서 찾는 방법도 있지만, 클론받아서 고칠게 있는 것이 아니라 단순히 궁금해서 찾아본 거라서 클론까지 갈 필요가 없다고 생각했다. 그래서 구글링하다가 깃허브에서 검색하는 구문에 대해서 알게되었다. 해결해야할 상황 깃허브에서 repository에서 button이라는 단어가 들어간 파일을 다 찾고 싶음! 해결방법 1. 찾아야되는 repository에 들어가서 빨간상자에 있는 검색창을 이용한다. 2. 검색창에 아래와 같은 형식을 이용해서 검색한다. `repo:/ ` 예를 들어 내 아이디가 `Id`이고, 탐색할 repository는 `ABCDE`, 찾아야할 단어는 `button..
❓문제 https://www.acmicpc.net/problem/20291 20291번: 파일 정리 친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를 www.acmicpc.net 파일정리라는 알고리즘을 푸는데 split(".")을 사용하여 문제를 풀려고 했다. Strint tmp = sbrus.txt; String[] tmp = str.split("."); >> 예상결과 [sbrus, txt] >> 실제 결과 [] 그런데 위와 같은 결과가 나왔다. 왜 이런 결과가 나오는 것일까? 그것은 정규식 표현식에서 .는 임의의 문자열을 의미하기 때문이다. 그래서 예상결과를 원한다면 ..