본문 바로가기

Spring132

@OneToOne 는 1:1 을 보장하지않는다 + unique 제약조건 @OneToOne ( 1:1 ) 매핑을 하면 데이터 입력 시 1:1 을 보장할까?? 위의 내용에 대해 테스트를 해보았다. Member 클래스, Locker 클래스가 있다. 조건은 Member 1명당 1개의 Locker만 사용할 수 있다. Member 클래스가 연관관계의 주인이 되며, Locker 클래스에서는 mappedBy를 사용해 양방향으로 연결해준다. 테스트 내용 : 1명의 락커에 1명 이상의 멤버가 들어가는지 확인한다. public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; @OneToOne @JoinColumn(name = "locker_id") priv.. 2022. 10. 17.
빈을 등록하기 위한 방법 @Configuraion, @Bean, @Component Spring IOC 컨테이너가 관리하는 자바 객체를 빈(Bean) 이라고 부른다. 일반적인 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 제어하고,객체를 직접 생성하고 조작을 했다. Class 를 생성하고 new 를 입력해서 원하는 객체를 직접 생성 후 사용했다. 즉 , 모든 작업자가 제어하는 구조로 흘러갔다. IOC(제어의역전) 가 적용될 경우, 객체의 생성을 특별한 주체에 맡긴다. 이러한 경우, 사용자는 객체를 직접 생성하지 않으며, 사용자가 제어권을 다른 주체에 넘긴다. new 를 이용하여 생성된 객체가 아니라, Spring에서 관리되는 자바 객체를 사용한다. Spring 에 의해 생성되고 관리되는 자바 객체를 Bean 이라고 한다. Bean 은 싱글톤으로 관리된다 @Configuration +.. 2022. 10. 14.
DispatchServlet(디스패처 서블릿) 에 대해 알아보자. DispatchServlet 의미 (Dispatch = 파견, 보내다) http 에서 들어온 모든 요청을 가장 앞단에서 받아 적합한 컨트롤러에 위임하는 프론트 컨트롤러이다. * 프론트 컨트롤러 : 서블릿 컨테이너의 제일 앞단에서 서버에 들어오는 클라이언트의 모든 요청을 받아 처리하는 컨트롤러 요청을 받아 어떤 controller 에게 위임을 할지 handlerMapping 을 통해 확인 후 HandlerAdapter를 통해 위임을 진행한다. Spring MVC 는 디스패처 서블릿이 등장함에 따라, web.xml 에서 각각 url 매핑을 등록하던 작업을 스킵하고 모든 요청을 핸들링하고 공통작업을 처리하면서 편리하게 이용이 가능해졌다. 모든 요청을 디스패처 서블릿이 받아 편리해진 것은 사실이다. 하지만, 이.. 2022. 10. 14.
@Controller 와 @RestController 의 원리 @Controller 해당 어노테이션의 목적은 Model 객체를 만들어 데이터를 담고 view를 반환하기 위함이다. 아래와 같은 과정으로 요청과 응답이 진행된다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller 클라이언트에서 uri 형식을 통해 요청을 보낸다. DisPathcherServlet 에서 해당 요청을 받아 HandlerMapping 을 통해 위임할 Controller를 찾는다. Controller 에서는 비즈니스 로직을 진행하여 데이터를 받는다. HandlerAdapter는 View Name을 받아 DispatcherServlet 에게 전달.. 2022. 10. 13.
@valid 를 사용해보자 (유효성 검사) https://josteady.tistory.com/683 유효성 검사(Validation) 유효성 검사 / 데이터 검증 (Validation) - 서비스의 비즈니스 로직이 옳바르게 동작하기 위해 사용되는 데이터에 대한 사점 검증하는 작업 - 데이터의 검증은 여러 계층에서 발생 - 데이터에 대 josteady.tistory.com 해당 포스팅에 이어 게시판관련 프로젝트를 만들면서 알게된점과 사용한 코드에 관해 정리하려고 한다. 아직 유효성검증 관련해서 궁금하고 미흡한 부분이 많아, 게시판(post) 관련해서 간단하게 작성했다. @Getter @Setter @NoArgsConstructor public class CreatePostDto { @NotBlank(message = "제목은 필수 값입니다.") .. 2022. 10. 13.
Where 다중 파라미터 사용 - 동적쿼리 동적쿼리를 다룰 수 있는 방법 2번째이다. 첫번째는 BooleanBuilder를 사용한 방법이였다. //Where 다중 파라미터 사용 @Test void 동적쿼리_whereParam() { String username = "member1"; Integer ageParam = 10; List result = searchMember2(username, ageParam); assertThat(result.size()).isEqualTo(1); } searchMember2 메서드를 확인해보면 아래와 같다. // 메서드 명으로 쉽게 의도를 알아차릴 수 있다. private List searchMember2(String usernameCond, Integer ageCond) { return queryFactory .. 2022. 10. 12.
BooleanBuilder - 동적 쿼리 쿼리 조건 설정인 where 뒤에 조건을 추가해줄 때 사용한다. // 동적쿼리 @Test void dynamicQuery_BooleanBuilder() { String username = "member1"; Integer ageParam = 10; List result = searchMember1(username,ageParam); assertThat(result.size()).isEqualTo(1); } username 이 member1 , age 가 10 인 회원을 찾는다고 할때, 위와 같이 searchMember1 이라는 메소드를 생성해 작성할 수 있다. searchMember1 메소드는 아래와 같다. private List searchMember1(String usernameCond, Intege.. 2022. 10. 12.
JPQL 과 QueryDsl 의 차이 (기초) 코드 작성에 효율적이며, JPQL 에 없는 큰 장점이 몇가지 있다. 1. 컴파일단계에서 에러를 잡아준다. -> 자바 문법으로 작성하는 QueryDsl 은 컴파일 오류로 잡을 수 있다. 2. 자동완성 기능이 뛰어나다. -> 메서드가 생각이 나지 않을때 자동완성 기능을 쉽게 사용할 수 있다. 3. 동적 쿼리 작성이 효율적이다 -> 아직 학습하지 않아서 다음에 포스팅. Entity 클래스는 생략. JPQL 코드 @Test public void startJPQL() { // member1을 찾아라 String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString.. 2022. 10. 9.
Querydsl 설정 설정 - gradle 의 빌드 및 테스트 실행 방법에 따라 검증방법이 상이하다. gradle 에 추가하는 방법은 동일 gradle 추가 // Querydsl 추가 시작 implementation 'com.querydsl:querydsl-jpa' implementation 'com.querydsl:querydsl-core' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.persistence:jakarta.persistence-api" annotationProcessor "jakarta.annotat.. 2022. 10. 9.