일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 지연로딩
- 낙관적락
- 데코레이터
- 이진탐색
- 비관적락
- shared lock
- 스토어드 프로시저
- 연결리스트
- fetch
- execute
- 유니크제약조건
- dfs
- querydsl
- 백트래킹
- FetchType
- CHECK OPTION
- BOJ
- PS
- JPQL
- 즉시로딩
- exclusive lock
- 연관관계
- 동적sql
- 일대다
- 다대일
- 다대다
- eager
- SQL프로그래밍
- 스프링 폼
- 힙
- Today
- Total
목록Spring (90)
흰 스타렉스에서 내가 내리지
@Entity @Getter @Setter @Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )}) public class Member { @Id @Column(name = "ID") private String id; @Column(name = "NAME", nullable = false, length = 10) private String username; private Integer age; } alter table member add constraint NAME_AGE_UNIQUE unique (name, age) UNIQUE 제약으로 들어..
변경감지에서 JPA의 기본 전략은 엔티티의 모든 필드를 업데이트한다. 필드가 많거나 저장되는 내용이 너무 크면 수정된 데이터만 사용해서 동적으로 UPDATE SQL을 생성하는 전략을 선택하면 된다. 단 이떄는 Hibernate 확장 기능을 사용해야 한다. @org.hibernate.annotations.DynamicUpdate 이 어노테이션을 사용하면 수정된 데이터만 사용해서 동적으로 UPDATE SQL를 생성한다. 참고로 데이터를 저장할 때 데이터가 존재하는 (null 이 아닌) 필드만으로 INSERT SQL을 동적으로 생성하는 @DynamicInsert도 있다. + 상황에 따라 다르지만 컬럼이 대략 30개 이상이 되면 기본 방법인 정적 수정 쿼리보다 @DynamicUpdate를 사용한 동적 수정 쿼리..
logback 스프링부트의 기본으로 설정되어 있어서 사용시 별도로 라이브러리를 추가하지 않아도 된다. spring boot logback 설정 ▶ 스프링, 일반 자바 프로그램 - logback.xml ▶ 스프링 부트 - logback-spring.xml 참고 순서 1. resources 디렉토리에 logback-spring.xml 파일이 있으면 읽는다. 2. logback-spring.xml 파일이 없다면 .yml 파일의 설정을 읽는다. 3. logback-spring.xml 파일과 .yml 파일이 동시에 있으면, .yml 설정파일을 적용한 후 .xml 파일이 적용된다. 로그 레벨 순서 및 사용방법 ▶ TRACE < DEBUG < INFO < WARN < ERROR 1) ERROR : 요청을 처리하는 중..
application.yml # default 공통설정 spring: --- # local 설정 spring: config: activate: on-profile: "local" server: port: 8080 --- # dev 설정 spring: config: activate: on-profile: "dev" server: port: 8081
package com.general.gen.filters; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.util.StreamUtils; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingResponseWrapper; import javax.servlet.F..
/** * 1. * 이 어노테이션이 생성될 수 있는 위치를 지정한다. * PARAMETER로 지정했으니 메소드의 파라미터로 선언된 객체에서만 사용할 수 있다. * 이 외에도 클래스 선언문에 쓸 수 있는 TYPE 등이 있다. */ /** * 2. * @Retention 어노테이션은 라이프사이클, * 즉, 어노테이션이 언제까지 살아 남아 있을지를 정하는 역할을 한다. */ @Target(ElementType.PARAMETER) // 1 @Retention(RetentionPolicy.RUNTIME) // 2 public @interface LoginUser { } @RequiredArgsConstructor @Component public class LoginUserArgumentResolver implem..
public PostsResponseDto findById(Long id){ Posts entity = postsRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id=" + id)); return new PostsResponseDto(entity); } /** * readOnly = true 옵션을 주면, * 트랜잭션 범위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선되기 때문에, * 등록, 수정, 삭제 기능이 전혀 없는 서비스 메서드에서 사용하는 것을 추천한다. */ @Transactional(readOnly = true) public List findAllDesc(){ return post..
@RequiredArgsConstructor @RestController public class PostsApiController { private final PostsService postsService; } 스프링에서 Bean을 주입받는 방식은 다음 3가지가 있다. 1. @Autowired 2. setter 3. 생성자 이 중 가장 권장하는 방식이 생성자로 주입받는 방식이다. @Autowired는 권장하지 않는다. 즉, 생성자로 Bean 객체를 받도록 하면 @Autowired와 동일한 효과를 볼 수 있다. 생성자는 lombok 라이브러리의 @RequiredArgsConstructor에서 해결해 준다. final이 선언된 모든 필드를 인자값으로 하는 생성자를 이 어노테이션이 생성해준다. 생성자를 직접 ..
공통 업무에 관련된 코드를 모든 페이지마다 작성해야 한다면 중복된 코드가 많아지고, 서버의 부하를 주고, 유지보수도 쉽지 않게 된다. 따라서 공통 부분을 따로 빼서 관리하는게 좋은데, 이 때 사용할 수 있는 것이 이 세가지. 1. Filter 2. Interceptor 3. AOP Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy 패턴의 형태로 실행된다. 실행순서를 보면 Filter가 가장 밖에 있고, 그 안에 Interceptor, 그 안에 AOP가 있는 형태이다. 따라서 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다. 1. Filter Spring 이 아닌 톰캣과 ..
Spring Interceptor란? 서버에 들어온 request 객체를 Controller의 Handler로 도달하기 전에, 개발자가 원하는 추가적인 작업을 한 후 Handler로 보낼 수 있도록 해준다. 왜 사용하는가? 예를들어, 관리자 계정만이 접근할 수 있는 핸들러에는 접근하는 사용자가 관리자인지 일반 유저인지 확인하는 코드를 작성해주어야 한다. 핸들러의 수가 수백개, 수천개가 된다면 같은 코드를 그 만큼 작성해주어야 한다. Interceptor를 사용하면, 개발자는 Handler 수 만큼 작성했던 코드를 인터셉터 클래스에 한번만 작성하면 된다. 이로 인해 코드의 양이 현저히 줄어 메모리 낭비와 코드의 누락가능성을 줄일 수 있다. 어떻게 사용하는가? 1. 스프링에서 제공하는 org.springfr..