본문 바로가기

Spring

(77)
@SpringBoot- @NotNull VS @Column(nullable=false) 공통점 우선 @Column(nullable = false)을 사용할 때와 마찬가지로 @NotNull 역시 테이블 생성시 NOT NULL DDL이 입력된다. 이는 Hibernate가 @NotNull 어노테이션 역시 해석할 수 있기 때문이다. 차이점 본격적인 차이로, @Column(nullable = false)는 JPA가 만든 엔티티의 필드 값이 null로 채워진 상태에서도 정상적으로 수행되다가 데이터베이스 쪽으로 SQL 쿼리가 도착한 순간에 테이블 컬럼의 NOT NULL 옵션에 의해 예외가 발생된다. 그러나 @NotNull 어노테이션은 데이터베이스 쪽으로 SQL 쿼리가 보내지기 전에, 정확히는 JPA가 만든 엔티티의 필드 값이 null로 채워지는 순간에 예외가 던져진다. 즉 @NotNull 어노테이션이 ..
SpringSecurity- SecurityConfig 설정 @EnableWebSecurity @EnableMethodSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().requestMatchers("/예외처리하고 싶은 url", "/예외처리하고 싶은 url"); } @Bean protected SecurityFilterChain webSecurityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests() .requestMatch..
SpringMVC- HTTP 요청 데이터 HTTP 요청 메시지를 통해서 클라이언트에서 서버로 데이터 전송하는 법 GET: 쿼리 파라미터 POST: HTML FORM HTTP message body 1) GET- 쿼리 파라미터 url의 파라미터에 값을 직접 넣어서 이를 전송하는 방식이다. 이는 따로 메시지 바디가 존재하지 않고 URL의 쿼리 파라미터에 직접 데이터를 넣어서 전송하는 방식이다. 주로 검색, 필터, 페이징등에서 자주 사용한다. 참고로 content-type은 HTTP 메시지 바디의 데이터 형식을 지정한다. 이때 GET URL 쿼리 파라미터 형식은 별도의 HTTP 메시지 바디가 존재하지 않으므로 content-type이 없다. 2) POST- HTML Form 메시지 바디에 데이터를 넣어서 이를 전송하는 방식이다. 주로 회원 가입과 상..
Spring -Dto, Vo 개념 정리 DTO(Data Transfer Object, 데이터 전송 객체) Database에서 데이터를 얻어 service나 controller 계층으로 전달할 때 사용하는 객체를 의미한다. 데이터를 전송하기 위해 사용하는 객체라서 그 안에 비즈니스 로직 같은 복잡한 코드는 없고 순수하게 전달하고 싶은 데이터만 담겨있다. DTO와 Entity의 분리 (Request DTO) 근데 왜 굳이 Entity 그자체를 넘기지 않고 Dto라는 별도의 데이터 전송만을 위한 객체를 만들어서 전달을 하는 것일까? 엔티티 자체를 넘기지 않고 꼭 필요한 특정 데이터만을 포함하는 Dto를 전달함으로 불필요한 데이터의 전달을 막고, 이는 통신과정에서의 불필요한 오버헤드의 감소로 이어진다 만일 엔티티 자체를 넘기는 경우, 데이터 베이스에..
SpringBoot- @DeleteMapping @PostMapping과 @DeleteMapping의 차이점. 기본적으로 POST 메서드를 통해서 DELETE 메서드의 역할을 충분히 수행할 수 있다. 그렇다면 굳이 @DeleteMapping을 사용하는 이유는 뭘까? - 가독성 가장 근본적인 이유는 가독성에 있다. 어떠한 엔티티를 삭제하기 위한 컨트롤러 메서드를 생성했다면 어노테이션으로는 @PostMapping 또는 @DeleteMapping을 사용할 수 있을텐데 이때 DeleteMapping으로 설정하게 된다면, 코드를 보는 입장에서 이 메서드는 명확하게 DELETE 메서드를 수행하는 메서드이다란 것을 이해할 수 있게 된다. @DeleteMapping 사용법 @DeleteMapping을 사용하기 위해선 설정이 필요하다. form 태그의 method에 ..
Querydsl- 벌크 연산 @Test // member.age가 28보다 적은 member.username을 "비회원"으로 update public void bulkUpdate() throws Exception{ // member1 = 10 -> 비회원 // member2 = 20 -> 비회원 // member3 = 30 -> 유지 // member4 = 40 -> 유지 long count = queryFactory .update(member) .set(member.username, "비회원") //조건을 만족하는 member의 username이 "비회원" .where(member.age.lt(28)) .execute(); // 안 해주면 영속성 컨텍스트에서 데이터 가져와서 업데이트된 DB의 값을 가져오지 못함 // em.flus..
Querydsl- 동적쿼리 BooleanBuilder querydsl에서는 BooleanBuilder 객체를 이용해서 동적 쿼리를 발생시킬 수 있다. 예를 들어 Member 엔티티를 조회하되, 해당 엔티티의 이름과 나이로 조회를 하는 메서드를 구현한다고 하자. @Test public void dynamicQuery_BooleanBuilder() throws Exception{ String usernameParam = "member1"; Integer ageParam = 10; // searchMember1: // 1) 인자가 모두 들어간 경우 두 조건을 모두 만족하는 엔티티 조회 // 2) 인자가 1개만 들어간 경우(나머지는 null인 경우) 들어간 조건으로만 엔티티 조회 // 3) 인자가 모두 null인 경우, 조건 없이 모두 ..
Querydsl- 프로젝션 프로젝션 프로젝션이란 select절로 조회할 대상을 지정하는 것을 의미한다. 예컨데 querydsl에서는 프로젝션 대상이 하나인 경우 단일 타입으로 반환을 하게된다. 프로젝션 대상이 하나인 경우 List result = queryFactory .select(member.username) .from(member) .fetch(); 반면에 프로젝션 대상이 여러개인 경우 튜플이나 DTO를 통해서 조회하게 된다. 프로젝션 대상이 여러개인 경우 List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(member...