분류 전체보기 43

[Spring] DTO, MultiPartFile 동시에 요청하기

User의 프로필을 수정하는 기능을 만들기 위해 UserUpdateDto 를 만들었다. 업데이트 내용에는 이름, 소개 글, 프로필 이미지가 포함 되는데 아래와 같이 RequestBody로 String인 username, profileText, MultipartFile인 image를 JSON타입으로 같이 받을 수 없었다. class UserUpdateDto{ private String username; private String profileText; private MultipartFile image; } 그래서 DTO에서 MultipartFile을 제외 시키고 class UserUpdateDto{ private String username; private String profileText; } Reque..

[Spring] devtools로 서버 재 시작 없이 resource(html, css, js) 반영하기, Automatic Restart

개발을 하다보면 html, css, js 을 자주 수정 할 일이 생기는데 devtools를 이용하면 서버를 재 시작하지 않고 변경내용을 반영 할 수 있다. devtools는 크게 5가지 기능을 제공하는데, 그 중 Automatic Restart를 이용하는 방법이다. Automatic Restart Property Defaults Live Reload Global Settings Remote Applications Automatic Restart (서버 재시작) classpath에 속해있는 파일이 수정되었는지 감지하고 자동으로 재시작을 해준다. 소스를 수정하고 재컴파일하면 서버가 실행중이어도 변경된 값이 반영 된다. 사용방법은 devtools 의존성 추가하면 끝이다. 의존성 추가 (gradle 기준) im..

[JPA] Auditing으로 저장 할 생성/수정 시간 DateTimeFormatter로 포매팅하기

엔티티가 생성되고(CreatedDate), 변경되는 시점(LastModifiedDate)을 자동으로 감지하여 column으로 저장하기 위해 Auditing 클래스인 BaseTimeEntity 클래스를 만들었다. 아래처럼 @CreatedDate 와 @LastModifiedDate 를 사용하여 LocalDateTime을 그대로 받으면 @CreatedDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime modifyDate; 이런 형식으로 날짜, 시간이 받아진다 2023-08-19T16:23:47.960583 알아보기도 힘들고 밀리세컨드 단위가 필요없어서 년-월-일 시:분:초 형식으로 변경하기로 하였다. 형식을 본인이 받고..

프로그래밍/JPA 2023.08.21

[Web] HTTP Method 종류

C (Create) POST R (Read) GET U (Update) PUT D (Delete) DELETE GET 리소스를 조회 정보를 서버에 요청할 때 HEAD GET과 동일하지만 response에 body부분을 제외하고, response code와 head만 반환 Resource를 받지 않고 찾기만 할 때 응답의 상태 코드를 확인할 때 Resource가 수정되었는지 확인 할 때 PUT 서버에 데이터를 수정, 작성 (GET과 반대) 서버가 Client 요청의 Body를 확인한다. 리소스를 대체 (덮어쓰기), 리소스가 없으면 생성 POST 서버에 데이터를 전송 HTML form 에 많이 사용 TRACE 루프백 메시지를 호출하기 위해 테스트용으로 사용 OPTION 리소스가 지원하고 있는 메서드를 취득 ..

2023.03.10

[JPA] 엔티티의 생명주기

상태 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 (managed) : 영속성 컨텍스트에 관리되는 상태 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) : 삭제된 상태 비영속 객체를 생성한 상태, JPA와 전혀 관계 없음 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 영속 객체를 저장한 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); EntityManager em = emf.createEntityManager..

프로그래밍/JPA 2023.01.20

벨킨 듀얼 디스플레이 도킹스테이션 맥북 M1 듀얼 모니터 연결하기

집에서 메인 PC로 M1 맥북에어를 사용중입니다. 작업할 때 보통 크롬, IDE는 기본으로 띄워놓고 + a 로 창을 띄워놓는데 M1 맥북에어는 외장디스플레이를 1개밖에 지원을 안합니다. 방법이 없을까 찾아보다가 Display Link 기술로 추가 모니터 확장이 가능하다는 글을 보게되어서 Display Link를 지원하는 어댑터나 허브를 구매하려고 찾아보던 중 애플 공식 서드파티이기도 하고 애용하고있는 벨킨의 듀얼 디스플레이 도킹스테이션 INC002qc 를 구매하게 되었네요 포트 구성은 전면에 USB-C, USB-A, 오디오 입/출력 후면에 이더넷, USB-A 2개, HDMI 2개로 구성되어 있습니다. 저는 모니터 2개를 연결할거라 HDMI 2개에 모니터를 모두 연결하고 전면에 USB-C로 맥북과 연결 했..

리뷰 2023.01.17

[Spring] 패키지 구조 - 계층형/도메인형

Spring 패키지 구조는 계층형 / 도메인형 으로 나눌 수 있습니다. 계층형 구조 계층형으로 디렉터리를 구성합니다. - controller, service, repository, domain, exception, dao ... 등 장점 구조 파악이 빠르다 단점 디렉토리에 클래스들이 너무 많이 모인다. 도메인형 구조 도메인 기준으로 디렉터리를 구성합니다. - order, member, item ... 등 장점 관련 코드들이 응집해 있다. 단점 구조 파악이 어렵다.

[Python, PyQt] 사용자 정의 시그널, 객체간 통신하기

PyQt 에서는 객체간 통신을 위해 시그널(Signal)과 슬롯(Slot)이라는 것을 사용합니다 시그널은 이벤트, 슬롯은 이벤트 핸들러라고 생각하시면 됩니다 이번 포스팅에는 시그널과 슬롯을 이용하여 객체간 통신을 테스트 해보겠습니다. 테스트할 예제는 이렇습니다. 통신할 클래스 키보드 입력을 기다리는 KeyboardThread 클래스 메인 윈도우 MyWindow 클래스 시나리오 1. KeyboardThread에서 키보드 입력을 키다리다가 원하는 입력이 들어오면 MyWindow로 시그널을 보낸다. 2. MyWindow에서는 받은 시그널에 맞는 이벤트 처리 함수를 실행한다. *테스트에 앞서 Thread 사용법, PyQt 사용에 대한 자세한 내용은 생략하겠습니다. 1. pyqtSignal, pyqtSlot 메서..

[Spring] 빈 생명주기(Bean LifeCycle) 콜백 개념 및 방식

애플리케이션 시작시점 및 종료시점에 작업이 필요한 경우가 있습니다. ex) 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결 ex) 종료 시점에 연결 종료 스프링을 통해 초기화 작업 및 종료작업을 어떻게 진행하는지 알아보겠습니다. 스프링 빈의 생명주기 스프링 빈은 다음과 같은 생명주기를 가집니다. 객체생성 -> 의존관계 주입 스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료 되는데 개발자가 의존관계 주입이 끝난 시점을 어떻게 알 수 있을까요? 스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 스프링은 의존..