반응형

전체 글 8

VO, DTO, DAO, Entity의 차이

이 글은 자바/스프링 개발자를 위한 실용주의 프로그래밍 (김우근 저, 위키북스)를 읽고 개인적으로 정리한 내용입니다. 내용에 오류가 있을 수 있으니 정확한 내용은 위 책을 참고해주시기 바랍니다.VO (Value Object)클래스에 final만 붙인다고 불변 객체가 아니다.심지어 객체 내 필드가 모두 final이라고 반드시 불변 객체인 것은 아니다.final이 붙은 멤버 변수의 참조 객체가 불변성을 지키지 않는다면 무용지물이다.각 필드도 오브젝트라면 그 오브젝트도 불변이어야 함Lombok 라이브러리의 @Value 어노테이션을 사용하면 VO로 사용 가능해진다.VO가 되기 위한 3가지 조건불변성값은 변하지 않는다. 숫자 1은 영원히 숫자 1불변성을 유지하기 위한 예시(불변 객체, VO는 아님)값 변경 시에는..

개발/객체지향 2024.11.11

IntelliJ 인텔리제이 플러그인 수동으로 마이그레이션하기

인트로IntelliJ를 사용하다보면 새 기기(노트북, 데스크탑)에 기존 기기에서 쓰던 설정을 마이그레이션해야하는 경우가 있다.그 때 JetBrains 아이디로 로그인된 상태로 기존 기기에서 아래 Settings Sync를 활성화 해둔 후 새 기기에서 로그인해 똑같이 활성화하면 자동으로 설정들을 가져온다. 그런데 나의 경우 다른 설정들은 모두 잘 가져왔는데 플러그인들만 정상적으로 가져오지 못한 것이다...!이를 해결하기 위해 여러 레퍼런스를 찾아 해결했고 그 방법을 공유하고자 한다.방법1. 기존 기기의 플러그인 디렉토리 위치 확인cd ~/Library/Application Support/JetBrains/[현재 내 IntelliJ 최신 버전]/plugins 윈도우, 리눅스의 경우 아래 링크를 참고하면 된다..

개발/기타 2024.06.17

IntelliJ + Git 사용 시 Add File to Git 알림에 대해

해당 알림의 경우 기존 프로젝트에 없던 파일을 생성했을 때 나타난다.Git의 코드 업로드가 Add → Commit → Push 순서인 건 이미 알고 있다고 생각한다(모르면 꼭 찾아보자)Add를 하지 않게되면 Commit 창에서 Unversioned Files에 위치하게 된다. 해당 파일을 커밋하기 위해서는 일단 Changes 하위로 들어가야 한다.새로 만든 파일을 Add하지 않았기 때문에 Unversioned Files에 있는 모습해당 파일을 우클릭 후 Add to VCS를 하게되면 파일 색상이 녹색으로 바뀌고 Changes 아래로 들어가게된다.Changes 밑으로 들어간 TestGitLab.java 파일Add File to Git 알림에서 Add를 누르면 위 과정이 생략되고 즉시 Changes에 Add..

개발/기타 2024.06.10

스프링 @Transactional 사용 팁, 주의 사항

1. private 메소드에 걸린 @Transactional은 동작하지 않는다@Service@RequiredArgsConstructorpublic class ApiService { private final ApiRepository apiRepository; @Transactional private void method1() { apiRepository.save(); }}이유스프링 AOP가 프록시 패턴을 사용하기 때문프록시 패턴을 쓰게 되면 외부에서 동적으로 프록시 객체를 사용하게 되는데 private 필드는 외부에서 프록시 객체를 생성할 수가 없기 때문에 AOP가 동작할수가 없다참고 글Spring - private 메서드에 @Transactional이 적용될까? 2. 내..

개발/스프링 2024.06.09

[OBJECTS 책 공부] 역할, 책임, 협력

[ALERT] 공부한 것을 정리한 글입니다. 부정확한 내용이 있을 수 있는 점 양해부탁드립니다! 피드백 주시면 감사히 받겠습니다 :) 1. 협력 객체지향 시스템은 자율적인 객체들의 공동체이다. 즉, 각자 능동적으로 역할을 수행한다. 이때 각 객체 사이의 협력을 위해 사용할 수 있는 유일한 통신 수단이 바로 메시지 전송이다. 협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. A객체가 B객체와 협력하기 위해 메시지를 전송하게되면 B 객체는 그 메시지를 수신하고 이에 맞는 메서드를 실행해 요청에 응답한다. 영화 예매 시스템에 방금 예를 대입해보자. Screening 객체가 Movie 객체에게 요금을 계산해달라는 calculateMovieFee라는 메시지를 전송한다. 그러면 Movie는 이에 응답..

개발/객체지향 2022.01.17

MySQL 무작위 SELECT 쿼리 (ORDER BY RAND())

어떤 테이블에서 row 중 N개를 무작위로 뽑아 가져오려면 어떻게 해야할까? 여러 솔루션이 있겠지만 가장 쉬운 방법은 ORDER BY와 RAND()함수, LIMIT을 함께 사용하는 것이다. 빠르게 사용법과 사용 예제를 살펴보자.  사용 방식SELECT [가져올 컬럼명] FROM [테이블 명] ORDER BY RAND() LIMIT [가져오려는 row 개수];개수 상관없이 전체 다 가져오려면 LIMIT [가져오려는 row 개수] 부분을 안 쓰면 된다.  사용 예시SELECT * FROM [테이블 명] ORDER BY RAND() LIMIT 7;이렇게 하게 되면 테이블에서 무작위로 7개만 가져오게 될 것이다. 마무리 만약 가져오려는 row의 개수보다 테이블에 존재하는 row의 개수가 더 적다면 에러 없이 존..

개발/DB 2021.12.02

[MySQL] 현재 시간에 시간 더하기(DATE_ADD, DATE_SUB 함수)

테이블 설계 중 행사 혹은 이벤트의 기한을 설정하기 위해 DATE타입의 2개의 컬럼을 추가했다. 하나는 created_at, 하나는 expired_at이다. created_at은 행사가 만들어진 시간을 의미하고 expired_at는 이벤트 종료 시점 혹은 이벤트 신청 마감을 의미한다.(영어 단어 선택이 이상하다고 느껴지면 그냥 넘어가주자...) 이때 created_at의 경우 현재 시간이 필요하므로 그냥 NOW()함수를 통해 쉽게 DATE를 추가할 수 있었다. 하지만 expired_at은 어떻게 해야할까? 예를 들어 현재 시점에서 3일 후가 행사 마감일이라면 이때 DB에 어떻게 삽입해야할까? 이때 쓰기 좋은 함수가 바로 DATE_ADD함수이다. 우선 사용 문법과 예시를 보자 시간 더하기(DATE_ADD)..

개발/DB 2021.12.02

[406 ERROR] Spring boot+ React 연동 시 발생하는 406 에러에 대해

여태까지 공부했던 얕은 지식을 바탕으로 맨 땅에 헤딩을 해보기로 했다. 그 첫번째 프로젝트는 바로 웹 서비스 구현! 프론트는 React, 서버는 Spring boot, DB는 MySQL을 이용할 계획이다. 프로젝트의 첫번째로 Spring boot와 React를 연동하는 작업에 착수했다. 참고한 블로그는 아래 링크에 있다. https://transferhwang.tistory.com/411 [Spring] 스프링 부트 + 리액트 환경 구축 및 연동 오늘 진행할 실습 스프링 부트 환경 구축 리액트 환경 구축 스프링부트와 리액트 연동하기 스프링 부트 환경 구축 먼저 스프링 부트 환경을 구축하도록 하겠습니다. 스프링 부트 환경을 구축하 transferhwang.tistory.com 문제가 생겼다. 토씨하나 틀리..

개발/스프링 2021.09.17
반응형