static을 사용하면 해당 필드는 Heap 영역이 아닌 Static 영역에 할당되며 프로그램이 종료될 때까지 프로그램이 메모리에 올라와 있는 동안 계속 존재하게 되어 시스템에 엄청난 부하를 주고 성능 이슈를 유발하게 된다. final 까지만 써서 재할당이 일어나지 않게만 해주고 멤버 필드에 static은 되도록이면 사용하지 말것! + util은 static으로 만드는게 좋다고 한다. 참고 링크 https://gf0308.tistory.com/m/14 [Spring] 스프링에서 멤버 필드에 의존성 주입을 표현할 때 'final'은 괜찮지만 'static final'은 안되는 (참조: https://djkeh.github.io/articles/Why-should-final-member-variables-b..
jpa interface에서 구현체를 만들려면 너무 많은 것을 override 해야 해서 방법을 찾던 중 custom repository interface를 같이 extends 해주는 방법을 찾았다. ProjectRepositoryCustom interface public interface ProjectRepositoryCustom { } ProjectRepositoryCustomImpl class public class ProjectInterestRelationRepositoryCustomImpl implements ProjectInterestRelationRepositoryCustom{ } JpaProjectRepository interface public interface JpaProjectRepo..
mySQL로 쿼리문을 짠 후에 JPQL로 바꿨다. select * from project as p join project_interest_relation as pir on p.prj_id = pir.prj_id where pir.in_id = 0; @Query(value = "select p from Project as p join ProjectInterestRelation as pir" + " on p.prjId=pir.project.prjId where pir.interest.inId = :interestId") List findByInterest(@Param("interestId") int interestId); 테스트 해본 결과 잘 작동된다!
https://hihinote.tistory.com/90 이메일 인증받기 (1) 회원가입 단계에서 사용자 인증을 받을 때 SMS 인증은 건당 요금이 나간다고 해서 이메일 인증을 채택했다. 먼저 이메일에 코드를 보내면 그 코드를 레디스에 저장하고 사용자가 코드값을 입력 hihinote.tistory.com 이 글과 이어지는 포스팅이다. 이메일 인증을 위해 코드를 보내면 데이터베이스에 유효시간이 있는 이메일 값과 코드 값을 저장해야 한다. 이렇게 키, 밸류 값으로 이뤄지고 유효시간이 있는 데이터를 저장할 때 Redis를 사용하면 좋다고 해서 사용했다. Redis에 대한 설명은 다른 포스팅에서 다루겠다. build.gradle dependency implementation 'org.springframework..
회원가입 단계에서 사용자 인증을 받을 때 SMS 인증은 건당 요금이 나간다고 해서 이메일 인증을 채택했다. 먼저 이메일에 코드를 보내면 그 코드를 레디스에 저장하고 사용자가 코드값을 입력하면 레디스의 값과 비교해서 인증을 하는 순서로 진행된다. 레디스와 관련된 내용은 다음 글에서 다룰 것이다. https://hihinote.tistory.com/91 이메일 인증에는 두 가지 방법이 있는데 인증번호 입력 방식과 링크 클릭 방식이다. 둘 중 인증번호 입력 방식을 사용했고 구글 이메일을 보내는 메일로 사용했다. 이메일 인증은 스프링에서 기본으로 제공하는 API를 사용해 쉽게 할 수 있었다. admin이메일 계정 설정 구글의 2단계 인증을 활성화한 후 앱 비밀번호를 생성하면 gmail 비밀번호 대신 사용 가능한..
프로젝트를 진행하면서 Controller와 Service, Domain, Repository로 계층을 분류해서 작업을 해왔는데 Dto와 VO, Dao같은 것들이 정확히 무엇인지 개념이 잡히지 않아 계층 구조를 정리하고자 한다. Controller @Controller 사용 request와 response에 대한 영역을 담당한다. Service @Service 사용 Controller와 Dao(Repository) 사이에서 사용된다. Repository Dao 영역으로 DB에 접근한다. DB 테이블보다 객체 중심의 Layer Repository로 다루는 객체를 다루기 위해 여러 Dao(여러 테이블) 사용 가능 영속성 객체임을 숨김 (구현체가 인프라 계층에 숨겨져 있음) Repository의 인터페이스는 도..
@GeneratedValue(strategy = GenerationType.AUTO) default insert 쿼리 전에 다음 id 값의 select, update 쿼리를 실행한 후 업데이트된 시퀀스 값으로 insert 쿼리 실행 @GeneratedValue(strategy = Generation Type.IDENTITY) pk 값 없이 insert 쿼리 실행 후 DB의 auto_increment 동작이 수행됨
외래키를 복합키로 사용하기 위해서는 연관관계를 맺어주고 JoinColumns으로 복합키의 id를 설정해야 한다. 이때 ManyToOne의 속성을 적절히 맞춰줘야 한다. (cascade 등) @Entity @Table(name = "project_interest_relation") @Data @ToString @AllArgsConstructor @NoArgsConstructor @IdClass(ProjectInterestRelationId.class) public class ProjectInterestRelation { @Id @ManyToOne(cascade = CascadeType.REMOVE) @JoinColumn(name = "prj_id") private Project project; @Id @M..