Development

    [JPA] JPQL FROM절 subquery를 해결하는 방법 (inline view)

    문제 상황 - JPA의 FROM절에 subquery를 넣는 상황. 문제 상황은 다음과 같다. 킥보드 사용량에 대한 consumption entity가 있고, 킥보드의 이동 경로에 대한 coordinate entity가 있다. consumption : coordinate는 1 : n 관계이며, coordinate entity에 다대일 매핑만 되어 있다. @Entity @Getter @NoArgsConstructor @AllArgsConstructor @Table(name = "consumption") public class Consumption { @Id @Column(name = "consumption_id") @GeneratedValue(strategy = GenerationType.IDENTITY) ..

    [Spring] DTO와 Entity 간의 변환

    Spring을 쓴다면 MVC 구조를 사용한다는 것을 전제로 깔고 갈 것이다. 따라서 Controller, Service, Repositoy, DB 순으로 flow가 이동하며, 이 과정에서 entity라는 객체와 DTO라는 객체를 사용한다. 정의를 먼저 살펴보자면, entity는 DB의 row 하나와 매핑되는 객체인 반면, DTO는 Data Transfer Object, 데이터를 옮기는 데 사용하는 객체이다. DTO의 필요성 DTO의 필요성에 대해서는 말할 필요도 없다. 만약 DTO가 없다고 가정해 보자. 그러면 entity를 사용자에게 노출시켜야 하는데, entity는 DB의 모든 column에 대한 정보를 가지고 있기 때문에 이를 사용자에게 노출시키는 것은 좋지 않다. 또한 entity에 내용이 부족해..

    [JPA] JPA @IdClass에 관해,,,

    JPA에서 IdClass는 entity의 key를 1개 이상의 column으로 지정할 수 있게 해 주는 기능이 있다. 구체적으로는 implements serializable 를 이용하는데, 이 idclass에 꼭 구현되어야 하는 함수가 2가지 있다. 바로 - equals : 두 객체의 내용이 같은지 equality를 비교해주는 함수 - hashCode : 두 객체가 같은 객체인지 identity를 비교해 주는 함수 이다. 이것을 구현해 주어도 되지만, @EqualsAndHashCode annotation을 사용해서 method를 생성할 수 있고, @Data annotation을 이용할 수도 있다. 왜냐하면 @Data annotation은 - @Getter - @Setter - @RequiredArgsCo..

    [JPA] JPA MySQL 몇 가지 이슈에 대해서,,, GenericJDBCException

    1. JPA는 맞게 짠 것 같은데 JPA가 안돌아 가는 경우. could not execute statement; nested exception is org.hibernate.exception. org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute 이런 에러가 뜨는 경우 - JPA, 즉 Spring에서 설정한 언어(UTF-8)과 mysql의 언어 셋, charset이 달라서 그렇다. 나는 docker로 mysql을 설치했다. 그런데 여기서 MySQL에서 아래 명령어를 쳐보자..

    [DB] MySQL 등 ERD에서 id를 long으로 두는 이유

    먼저, sql table의 primary key를 id라는 이름으로, 특별한 값을 넣지 않고 long이나 int형으로 숫자로 많이 두곤 한다. sql에서 join이나 data 탐색 등의 경우의 수를 생각해 봤을 때, primary key에 유의미한, 그리고 식별이 되는 값을 넣는게 좋지 않을까? 실제로 성능은 이게 더 나올 것이다. 그러나 이렇게 하지 않는 이유는 1) 보안상의 이유 2) 확장성의 이유 크게 2가지가 있다고 생각한다. 먼저 primary key는 어떤 일이 있더라도 겹치면 안 된다는 것은 기본이다. 예를 들어서 member라는 table에 id를 member가 회원가입할 때 등록했던 id로 지정했다고 해 보자. 그러면 member.id는 varchar형태일 것이고, id는 중복이 되지 않..

    [JPA] JPA 단방향 vs 양방향

    JPA를 이용해서 구성하고 있는데... 다대일 단방향과 양방향에 대한 고찰이다. 일반적으로 다대일을 쓰는 거라고 한다. 그러면 member - team 관계가 있다고 가정하자.. (member:team=n:1 관계) 여러 자료들을 찾아보니 다대일 관계를 가질 때, '다' 쪽에서 외래키를 가지고 다대일 단방향 관계를 구성한다고 배웠ㄷ다. 필요할 때 양방향 관계를 구성한다고 하고. 그런데 이 '필요할 때'를 잘 모르겠다. 정말 양방향 연결이 필요한가? JPA는 '다'쪽에서 '1'쪽에 대한 정보를 가지고 있고, '1'쪽에서 '다'쪽에 대한 정보는 가지고 있지 않다. member-team의 관계에서 member는 어떤 team인지 알 수 있지만, team에 어떤 member가 있는지는 알 수 없기 때문이다. 그..

    [Utils] API 설계 백그라운드

    RESTful API 설계 가이드 https://sanghaklee.tistory.com/57 자주 사용하는 http status code https://gist.github.com/subicura/8329759 200번대 200 OK request 성공 ex) resource 목록/resource 상세/resource 수정/그외 대부분의 API 성공 성공 메시지가 날아오는 경우는 200이라고 생각해도 무방 201 Created request 성공 ex) resource 생성 성공 204 No Content request 성공 ex) resource 삭제 성공 300번대 301 move permanently 페이지 이동 307 temporary_redirect 임시 페이지 이동 400번대 400 Bad ..

    [Spring] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 정리, 인프런 김영한 스프링

    스프링 토이프로젝트를 하나 만들긴 했지만 내가 한 것은 기술을 어떻게 사용하느냐지, 어떻게 만들어졌는가는 생각하지 않았다. 모든 분야가 그렇듯 동작 원리에 대해 이해해야 더 좋은 코드를 작성할 수 있기 때문에 스프링 그 자체에 대해 공부를 조금 해 볼 예정이다. 인프런의 김영한님의 강의를 몇 개 들을 예정이다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard 이 글은 위 링크에 있는 강의를 정리한 글이다. 이후에 유료강의들은 비공개로 정리할 예정이고. 1. 프로젝트 환경설정 1) 프로젝트 생성 나는 VS Code ..

    [Lombok] Lombok의 Getter, Setter with VS Code

    @Getter @Setter annotation attribute에 붙이면 해당 attribute에 getter, setter method가 생기고 class에 붙이면 class의 모든 attribute에 생김. 변수 이름이 asdf면 getAsdf() setAsdf() 이 함수들이 생성이 됨. VS Code에서 작동하지 않는 경우 1) extension에서 Lombok Annotations Support for VS Code 설치 2) build.gradle dependency에 아래 코드 추가 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'

    [Docker + Spring] Docker gradle Spring Boot with VS Code JPA MySQL 게시판 생성 - 5. 자잘한 수정사항

    1. local에서 F5나 build해서 실행하면 잘 되었는데, docker 환경/서버에 올리니까 안됨! 아래 게시글을 참고했다. return "~.html"을 할 때 습관적으로 제일 앞에 /를 붙여 절대경로로 만들어서 문제가 생겼던 것 같다. 빼니까 잘 된다. https://devkingdom.tistory.com/149

    [Docker + Spring] Docker gradle Spring Boot with VS Code JPA MySQL 게시판 생성 - 4. EC2 배포

    1. EC2에 인스턴스 생성 IAM 계정으로 시작하는 것을 추천한다고 한다. (IAM 계정은 해킹당하더라도 다른 container에 권한이 부족하기 때문에 접속 불가) 1) instance 시작 2) AMI 선택 3) instance type 선택 4) instance detail 선택 5) storage 추가 6) 태그 추가 7) 보안 그룹 설정 서버 접속을 위한 SSH 접근은 포트 22번, 웹 서버 활용을 위한 포트는 443으로 적용되었다. 8) 키 페어 선택 ssh 접속을 위해 필요한 파일이라 한다. 이것이 있어야 인스턴스에 접속할 수 있다는 것 같다. 9) instance 확인 뭔가 돌아가고 있다. 상태 검사가 검사 통과 상태면 인스턴스 실행 중이라는 것이다. 2. EC2에 인스턴스에 접속 1) ..

    [Docker + Spring] Docker gradle Spring Boot with VS Code JPA MySQL 게시판 생성 - 2. 게시글 CRUD

    1. 게시글 작성, Create 앞 게시글에서 spring의 구조에 대해 다루었다. Controller, Service, Repository, DTO, Entity를 복습하자면 아래와 같다. 해당 프로젝트에서 service는 JPA interface인 repository를 불러올 것이다. - controller controller는 client의 요청을 받아서 처리해준다. controller는 service를 호출해서 요청을 처리한다. - service service는 business logic을 수행한다. - Repository spring data JPA는 repository라는 interface를 제공한다. JPA를 추상화 한 것으로, interface에 맞는 규칙대로 입력하면 spring이 알아서..

    [Docker + Spring] Docker gradle Spring Boot with VS Code JPA MySQL 게시판 생성 - 3. 검색기능Search

    1. 검색기능 - SELECT resources/templates/list.html의 검색하기 버튼을 누르면 /board/search로 GET method가 요청된다. 요청이 가면 controller에서는 boardService.searchPost(keyword) method를 이용해 해당하는 DTO만 SELECT하게 하고, 받아온 DTO list를 model에 addAttribute한 후 return하자. 1) Controller /src/main/java/com/example/testcompose/controller/BoardController.java package com.example.testcompose.controller; import com.example.testcompose.dto.Boar..

    [Docker + Spring] Docker gradle Spring Boot with VS Code JPA MySQL 게시판 생성 - 1. 전체 구조 잡기

    https://victorydntmd.tistory.com/325 https://velog.io/@max9106/Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1 위 두 글을 바탕으로 구성하고, 진행했다. 1. 수정사항, 의존성 설정, 전체적 구조 잡기 개발환경 IDEA : VS Code Java : openjdk 11 Gradle : 7.0.2 Spring Boot : 2.5.2 Docker : 20.10.7 라이브러리 MySQL : DB JPA : DB와 연동을 위해 필요함 Thymeleaf : resource/templates에 있는 html 파일을 읽어오기 위해 필요함 Lombok : NoArgsConstructor라는 Con..

    [Socket.io] socket.io 간단한 예제

    간단한 예제를 만든다. 먼저, socket.io는 각 client에서 라이브러리를 로딩해주는 socket.io의 client, 그리고 서버를 구성하는 socket.io가 있다. var server = http.createServer(app); const io = require('socket.io')(server); // connection이라는 이벤트가 발생하면 유저 연결이라는 신호를 주고, 아래 2개의 이벤트가 발생하면 callbak해줌. // chat message라는 이벤트가 발생하면 io에서 msg를 emit하고 // disconnect라는 이벤트가 발생하면 유저의 연결을 끊어 줌. io.on('connection', (socket) => { console.log("a user connected"..

    [Node.js] 프로젝트 미어캣 서버 연결하며 있었던 이슈

    1. mixed content error https server에서 http로 요청하면 안 된다. 그러한 규칙이 있다. 2. 서버에 SSL 적용 그래서 서버에 ssl을 적용하려 했다. 기존 nginx에 적용되고 있던 인증서를 그대로 express에 적용하려 했으나 문제가 발생했다. 그래서 express는 8081에 배포, nginx는 8082에 들어오는 것을 ssl 설정해서 8081로 포트포워딩하는 방식을 채용했다. 3. trust anchor for certification path not found 오류 openssl을 이용해 새 인증서를 발급받고 그걸 node server에 적용함으로써 해결했음. 개발 서버의 local은 해당 서버의 ssl이 적용되어서 그런 게 아닐까... -> 시간이 지나니까 해..

    [Node.js] Node.js + typescript MVC 코딩 패턴

    Node.js 코딩 패턴 이 구조에 대해 좀 더 자세히 이해하려면 node.js MVC 패턴인 Routes-Controller-Service에 대해 좀 자세히 알아야 할 것 같다. 먼저 각각의 용어에 대한 설명은 다음과 같다. Route Request end point를 어디에서 처리할지, 즉 경로와 그 경로에 대한 처리 함수들을 모아 둔 곳이다. 다음과 같은 형식으로 이루어져 있으며, [PATH]가 호출되었을 때 [Controller 함수]를 호출하는 역할을 한다. router.get([PATH], [Controller 함수]); Controller 사용자에게 어떤 값을 전해줄지 가공하는 부분. Service로부터 값을 받아와서 http header나 body에 값을 넣고 예외처리하고, 응답하는 역할을..

    [Utils] ngrok

    사지방이나 container와 같은 환경에서 포트를 바꾸고 열어주려면 방화벽에 들어가 새로운 포트를 열어줘야 한다. 그러나, 귀찮다! 그래서 nrgok을 이용해 터널링으로 public에서 내 포트로 접속할 수 있게 열 수 있다. 아주 편리하다! 다음 링크에서 다운로드 받을 수 있다. [다운로드 링크] 다운로드 페이지에서 설치했다면 ngrok의 토큰을 등록해야 한다. 다음 링크에서 로그인을 하자. [ngrok 로그인] 로그인 했다면, 다음 링크에서 connect your account 부분을 복붙하자. [token 가져오기] 이후, 다음 명령어를 이용해 해당 포트로의 우회가 가능하다. ngrok http [PORT]

    [Java] HttpURLConnection으로 HTTP 통신하기

    Overview 자바에서 HTTP 연결을 할 때, 일반적으로 HttpURLConnection을 사용한다. python의 경우 .request method에 여러 가지가 override되어 있어 HTTP 연결 방식(GET, POST, ...), parameter, 파일 입력 여부 등등을 함수의 인자로 넣으면 알아서 처리를 해 준다. 그러나 자바는 그런 게 없다. 따라서 연결 방식, parameter, 파일 입력 등을 직접 header와 body에 작성해 주어야 하고, 그 결과도 response code에 따라 error stream인지, 정상적인 stream인지 판단을 해야 한다. 따라서 해당 글에서는 Java에서 HttpURLConnection을 사용하는 방법을 설명하고자 한다. HttpConnectio..

    [Spring] Spring Boot MVC 개념 이해

    SWM 프로젝트로 spring을 이용해 BE 구성을 하지 싶다. 그래서 배워보고자 spring을 이용해 게시판 CRUD를 해 보자. 개인적으로, Node.js에 비해 Spring이 진입장벽이 더 높은 것 같긴 하다. 나는 C++을 메인으로 학교에서 배웠기 때문에 API 코드를 짜면 그 url로 접속하면 해당 함수 내에 있는 것들만 수행된다는 것이 상당히 직관적이었기 때문이다. 그런데 Spring은 MVC 2 형태라고 해서, controller, service, DAO, servlet, DB와 연동을 위해서는 mybatis, JPA, hibernate, mapper 등, 또 그걸 쓰려면 entity, DTO, repository까지... 알아야 할 것이 너무 많다. 처음에는 "springboot 시작하기"..

    [Socket.io] 채팅 기능에 관한 고찰

    실시간 채팅 구현 조금 생각을 해 보았다. 1) 온라인 -> socketio로 연결해서 실시간 통신 1.5) 백그라운드 -> FCM으로 push 알람만 보냄. 2) 오프라인 -> 아무것도 하지 않음. 다만 온라인으로 상태 변경 시, 서버에서 읽지 않은 메시지 목록을 전부 받아오면 될 듯. + 읽은 기능 구현은 users - room join table에 해당 유저가 접속한 시간을 적고, 그 시간이 갱신되면 그것보다 작은 것들의 읽은 시간을 갱신하면 될 듯. ​ 저번에 올린 예제를 만든 파일의 경우, 인터넷 연결이 끊기면 메시지를 받을 수 없다는 문제점이 존재했다. 그래서 서버에 보낸 메시지를 저장하는 schema를 추가하려고 합니다. 형태는 ((보낸 시간, 방 번호), 보낸 사람, 메시지 내용) 정도로 ..

    [개발서적] Clean Code 정리

    1. 의미 있는 이름을 작성하자 누가 보든 알아보기 쉽게 변수명과 함수명을 작성하자 읽기 쉽고, 직관적인 단어를 사용하자(줄임말 말고) 코드 길이가 조금 길어지더라도 상수를 변수로 사용하자(검색의 편의를 위해) 클래스 이름 : 명사/명사구 메소드 이름 : 동사/동사구 한 개념에 한 단어(동의어를 사용하지 말 것)​ 2. 함수는 작게 작성하자 ​최대한 짧게 작성하자. indent는 1-2개 정도로 두자. 함수 이름을 서술어로 잘 설정해서 코드만 읽어도 이해되게 해 보자. 함수는 1가지 역할만 하자. (추상화 수준을 1개로 만들자는 것) 함수 인수는 최대한 적게 두자. 3. 주석은 최대한 없애자 주석이 필요없을 정도로 깔끔한 코드를 짜면 된다. 필요하다면, 의도와 의미를 명확하게 설명하자. 필요한 주석은, ..