@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import({SangsSecurityConfig.class}) @EnableWebSecurity public @interface SangsSecurity { @AliasFor(annotation = EnableWebSecurity.class) boolean debug() default false; SecurityMode[] modes() default {SecurityMode.DEFAULT}; } @Configuration public class SangsSecurityConfig implements ImportAware { ... @Override public void setImportMe..
Spring 개발중 @Service 를 interface 와 구현체(implements)로 나눠서 작성하는 이유는, 협업 One Source 로 개발하고, Build 에 따라 구현체를 변경 으로 생각한다. 아직까진 규모가 있는 프로젝트를 수행한적이 없다보니 1번보단 2번의 이유가 더 와닿는다. 아무튼 기존 Spring Boot 이전의 web.xml, application-context.xml 을 사용하던 시절의 Spring 에서, 일부러 @Service Annotation 을 사용하지 않고 context.xml 단에서 Class 를 bean 으로 주입하는 패턴을 종종 사용했는데, 이번에 Spring Boot 에서 해보려니까 골치가 아프다. 현재 시도중인것은 FileManager 를 Local Storag..
@MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class CommInfo { @CreatedDate @Column(nullable=false, updatable = false) private Date dtCreate = null; @LastModifiedDate @Column(nullable=false) private Date dtUpdate = null; // Getter, Setter } @EnableJpaAuditing 설정 뒤 @CreatedDate, @LastModifiedDate 를 통해 생성일, 수정일을 관리하려 하였으나, ( https://adonika.tistory.com/33 ) 생성일은 잘 입력되는데 수..
Validation 객체를 통해 데이터 유효성 검증을 진행해야하는데, javax.validation.Valid 와 org.springframework.validation.annotation.Validated 간의 차이점을 알게되어 짧게 글을 남긴다. ** 검증할 객체 public class BoardAdd { @NotBlank private String title; //@NotBlank(message = "{validation.board.test}") // messageSource 에 접근 가능 @NotBlank private String content; private String name; private String pwd; // Getter, Setter } 1. @Valid - Java 에서 지원하..

처음 교육을 받았던 시점부터, 버릇처럼 service - impl 구조로 패키지를 작성하였다. 그리고 실제로, impl(이하 구현체)를 properties에 따라 교체할 수 있도록 bean manager 를 이용하기도 하였다. 하지만 이번에 Entity 관련 글을 작성 및 service 를 수정하는 가운데, JPA 가 service - impl 어울리지 않는다는 거부감이 들었다. public interface BoardManager { BoardInfo create(BoardInfo boardInfo, Long seqUser); BoardInfo findById(Long seqBoard); List findAll(BoardForm boardForm); T findById(Long seqBoard, Cla..

글이 길어져서 Specification 구현 부분을 별도로 나누도록 한다. ( 기존처럼 작성한 코드를 먼저 보여주고 설명하기 보단, 거꾸로 어쩌다 그런 코드가 됬는질 단계별로 설명하는게 적절한 방향인것 같다. ) 우선 Board 에서 제목(title) 으로 검색하기 위해 어떻게 해야하는지를 살펴보자. boardDao.findAll(spec); boardDao 에서 findAll 을 통해 list 를 조회를 하려고 하는데, Specification 인터페이스의 구현체가 필요하다. 구현해보자 ... 그러나, 그에 앞서서, 우리는 이제부터 Where 절이라는걸 알려야한다. ( 내용을 봤을땐 없어도 될거 같긴한데... 나중에 확인해보자 ) boardDao.findAll(Specification.where(spe..
이번에 글 쓰는데 가장 핵심인 Repository 와 Specification 이다. 일단 이 둘을 각각 한줄로 요약하면, Repository 는 DTO 와 DB 를 연결하는 DAO 에 해당하는 인터페이스이다. Specification 은 쿼리를 작성하기 위한 방법 중 하나이다. ( 항상 쓰지만, 정확한 정의는 아닐것이다. 내가 아는데로 나열하는 것 뿐 ... ) 때문에 Repository 는 JPA 구성의 기본으로, 무조건 있어야 하는 인터페이스이고, Specification 은 사용하지 않아도 문제되진 않는다. 다만, hibernate 의 기본 쿼리 방식은 아래와 같이, @Repository public interface UserDao extends CommRepository { /* SELECT *..
데이터베이스를 구성하다보면, Row 의 생성자(작성자), 생성일 등 Table 의 용도를 넘어서서 공통적, 반복적으로 추가되는 Column 들이 있다. 한번만 생성하는 정도론 문제가 되진 않지만, 데이터 길이나 컬럼명 등을 수정하고자 하면 어마어마한 반복작업이 필요하게 된다. 하지만 JPA 는 클래스 단위로 Entity 를 구성하기때문에 이 문제로부터 자유롭다. - UserInfo.java import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity public class UserInfo extends CommInfo { @Id @GeneratedValue(strategy = GenerationType.IDEN..
하루라도 거르면 계속 거르게 되네... 빨리 쓸수 있는데까지 써놔야지. 원래 Specification 쓰려고 했는데, 생각해보니 Entity 도 안썼다. 짧게 쓰고 넘어가야겠다. Entity 란, Table 정의서 + DB Row 를 객체화 시킨것 이라고 보면 될 것 같다. @Entity Annotation 이 적용된 객체는, 프로젝트 실행시 hibernate 의 DDL 전략에 따라 Table 을 생성 or 수정하게 된다. - application.properties spring.jpa.hibernate.ddl-auto=update DDL 전략은 아래와 같이 있다. none : 건들지 않음 create : 존재하는 테이블이 없는 경우에만 생성함 validate : 존재하는 테이블과 Entity 에 명시..
개인적으로 생각하는 JPA 장단점. 장점: 1. 테이블 생성, 수정이 쉽다. 2. 객체에 직접 매핑되기때문에 (경우에 따라)관계가 직관적. 단점: 1. 조회 성능이 걱정됨. 일단 Fetch 전략을 잘 짜놓아서 N+1 문제를 잘 피해야하는건 무조건이고, 조회되는 Row 자체가 클때 메모리 및 속도에 문제가 생길 수 있기 때문에 경우에 따라 테이블을 찢어야 한다고 하더라. -> 결국 보고서 같은 복잡한 쿼리를 조회하기 위해선 Mybatis 를 같이 사용하기도 한다고 함. 2. 버전 관리 문제. 컬럼을 추가하는건 괜찮지만, 수정 및 제거시 문제 발생 가능. 배포 후 롤백을 못하는 수가... 물론, Mybatis 류를 써도 생길 문제긴 하지만, 아깝다는 느낌이 크다. -> 때문에 DDL 전략을 none 으로 꺼..
- Total
- Today
- Yesterday
- @Validated
- docker
- Spring Cloud Config
- jquery
- BannSang Korean
- github-actions
- Cloud SQL
- nodejs
- Spring
- auditing
- Hunua Falls
- istio
- vue3
- BeanFactoryPostProcessor
- JPA
- Cosseys Dam
- @Profile
- pinia
- GCP
- EnvironmentAware
- Waitawa Regional Park
- Murrays Bay
- Specification
- kubernetes
- springboot
- Browns Bay
- Pinehill
- AWS
- k8s
- express
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |