본문 바로가기
Spring

Spring (Enum, Query Method 기본, Optional, @Bean)

by code2772 2022. 12. 11.

[ 목차 ]

    728x90
    반응형

    ✔ Enum Class 기본

     

    Enum 클래스
    - 열거체를 비교할 때 실제 값과 타입까지 체크할 수 있는 클래스
    
        enum 열거체이름 { 값1, 값2, 값3 ... }
    
        열거체이름 변수명;
    
        for(int i=0; i<10;i++){
            ...
        }
    
        for(int i=start; i<end; i++){
            ...
        }
    
    Query Method
    find... By필드 : findUserByUserid, findByUserid(쿼리 메소드 명)
    read... By필드 : readByUserid
    get... By필드 : getByUserid
    query... By필드 : queryByUserid
    search... By필드 : searchByUserid
    stream... By필드 : streamByUserid

     

    ✔ Enum Class

     

    package com.koreait.day4.model.enumclass;
    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    
    //enum클래스 만들기
    @AllArgsConstructor
    @Getter
    public enum UserStatus {
        REGISTERED(0, "가입","사용자 가입상태"),
        UNREGISTERED(1, "탈퇴","사용자 탈퇴상태");
    
        private Integer id;
        private String title;
        private String description;
    
    }
    

    서로 관련 있는 상수들을 모아 심볼릭한 명칭의 집합으로 정의한 것

     

     

     

    ✔ 기본적인 Query Method

     

    System.out.println(usersRepository.findNameByName("김사과"));
    System.out.println(usersRepository.findByEmail("banana@banana.com"));
    System.out.println(usersRepository.readByEmail("bery@bery.com"));

     

    🎈 findNameByName = findByName 과 동일하다 중간 Name은 생략해도 가능하다

    🎈 readByEmail = findByEmail과 동일하다.

     

     

     

    ✔ 이름 Query

     

    System.out.println(usersRepository.findFirst3ByName("김사과"));
    System.out.println(usersRepository.findTop10ByName("김사과"));
    System.out.println(usersRepository.findLast3ByName("김사과"));

     

     

     

    ✔ 조건 및 시간 Query

     

    System.out.println(usersRepository.findByNameAndEmail("송사과", "apple@naver.com"));
    System.out.println(usersRepository.findByNameOrEmail("송사과", "banana@banana.com"));
    System.out.println(usersRepository.findByIdAfter(2l));
    System.out.println(usersRepository.findByRegDateAfter(LocalDateTime.now())); // 사간 계산
    System.out.println(usersRepository.findByRegDateBefore(LocalDateTime.now())); // 전날
    System.out.println(usersRepository.findByRegDateAfter(LocalDateTime.now().minusDays(2L))); // 날포함한 전날
    System.out.println(usersRepository.findByIdGreaterThanEqual(2l));
    System.out.println(usersRepository.findByIdGreaterThanEqualAndIdLessThanEqual(2l,5l)); //2이상 5이하
    System.out.println(usersRepository.findByIdBetween(2l,5l));

     

    🎈 findByRegDateAfter : 다음 날

    🎈 findByRegDateBefore : 전 날

    🎈 findByRegDateAfter (LocalDateTime.now().minusDays(2l)) : 오늘, 어제

     

    🎈 findByIdGreaterThanEqual(A) : A 이상

    🎈 findByIdLessThanEqual(A) : A 이하

     

     

     

    ✔ RegDdate, SQL Like문 Query

     

    System.out.println(usersRepository.findByNameIn(Lists.newArrayList("반하나","체에리")));
    System.out.println(usersRepository.findByNameStartingWith("송"));
    System.out.println(usersRepository.findByNameEndingWith("과"));
    System.out.println(usersRepository.findByNameContains("사"));
    System.out.println(usersRepository.findByNameLike("%하%"));

     

    🎈 findByNameIn(List,newArrayList(변수1, 변수2)) : SQL문 IN(변수1, 변수2)를 사용 Lists.newArrayList를 사용하여 변수를 저장해서 내가 원하는 변수를 찾는 구문

    🎈 findByNameStartWith("A") :  A로 시작하는 

    🎈 findByNameEndingtWith("A") : A로 끝나는

    🎈 findByNameContains("A") :  A가 포함된

     

    🎈 .findByNameLike("%A%") : SQL 방식으로 A가 포함된 = findByNameContains("A") 

     

     

     

    ✔ SQL 정렬 Query

     

    System.out.println(usersRepository.findTopByNameOrderByIdDesc("송사과"));
    System.out.println(usersRepository.findByOrderByIdDesc());
    System.out.println(usersRepository.findByOrderByIdDescNameAsc());

     

     

    ✔ Query 이용한 데이터 확인

     

    @Test
    public void updateUserid(){
        //아이디를 통해 데이터를 변경
        Optional<Users> users = usersRepository.findByUserid("apple");
        users.ifPresent(
                selectUser ->{
                    selectUser.setEmail("apple@naver.com");
                    selectUser.setHp("010-1000-1000");
                    selectUser.setName("송사과");
                    selectUser.setUpdateDate(LocalDateTime.now());
                    usersRepository.save(selectUser);
                }
        );
    }
    
    @Test
    public void deleteUserid(){
        //아이디를 통해 데이터를 삭제
        Optional<Users> users = usersRepository.findByUserid("orange");
        users.ifPresent(
                selectUser ->{
                    usersRepository.delete(selectUser);
                }
        );
    }
    
    @Test
    public void login(){
        //userid , hp, email
    
        Optional<Users> users = usersRepository.findByUseridAndUserpw("apple","2222");
        users.ifPresent(
                selectUser ->{
                    System.out.println("userid : " +selectUser.getUserid());
                    System.out.println("hp : " +selectUser.getHp());
                    System.out.println("email : " +selectUser.getEmail());
                }
        );
    

     

    위에서는 UserRepository에서 선언간 다양한 경우가 나올걸 예상하여 List로 선언을 하였다. 여기에서는 ID, PW 등을 확인하여 변경을 하기 때문에 Optional<>을 사용하여 찾는 내용이 있으면 출력할 수 있도록 하였다.

     

    🔒 Optional<T> 클래스 :  NullPointException을 방지. null이 올 수 있는 값을 감싸는 Wrapper 클래스, Optional은 값을 저장하기 때문에 값이 null이더라도 실행이 가능하다. 

    위와 같이 만일 apple이라는 UserId를 찾는데 apple이 없어도 NullPointException이 일어나지 않는다는 점이 있어 List로 선언이 아닌 다양한 변수를 저장 가능하고 예외를 방지할 수 있는 Optional을 사용

     

     

     

    ✔ UsersRepository 전체

     

    package com.koreait.day4.repository;
    
    
    import com.koreait.day4.model.entity.Users;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    import java.time.LocalDateTime;
    import java.util.List;
    import java.util.Optional;
    import java.util.Set;
    
    @Repository
    public interface UsersRepository extends JpaRepository<Users, Long> {
        Users findNameByName(String name); // find...By필드명,  메소드 생성
        Users findByEmail(String email);
        List<Users> getByEmail(String email);
        Set<Users> readByEmail(String email); // List와 유사하나 Set은 중복을 배제하고 정해진 순서는 없다
        Users queryAppleByEmail(String email);
    
        List<Users> findFirst3ByName(String name);
        List<Users> findTop10ByName(String name);
        List<Users> findLast3ByName(String name);
    
        Optional<Users> findByUserid(String userid);
    
        List<Users> findByNameAndEmail(String name, String email);
        List<Users> findByNameOrEmail(String name, String email);
    
        List<Users> findByIdAfter(Long id);//해당 아이디를 포함하지 않음
        List<Users> findByRegDateAfter(LocalDateTime dateTime);
        List<Users> findByRegDateBefore(LocalDateTime dateTime);
        List<Users> findByIdGreaterThanEqual(Long id); // ~이상, 해당 id를 포함
        List<Users> findByIdGreaterThanEqualAndIdLessThanEqual(Long id1, Long id2);
        List<Users> findByIdBetween(Long id1, Long id2);
    
    
        List<Users> findByRegDateIsNull();
        List<Users> findByRegDateIsNotNull();
    
    
        List<Users> findByNameIn(List<String> names);
        List<Users> findByNameStartingWith(String name);// 시작
        List<Users> findByNameEndingWith(String name);//끝
        List<Users> findByNameContains(String name);//포한하는 글자
        List<Users> findByNameLike(String name);
    
        Optional<Users> findByUseridAndUserpw(String userid, String userpw);
        List<Users> findTopByNameOrderByIdDesc(String name);// 이름 내림차순
        List<Users> findByOrderByIdDesc();
        List<Users> findByOrderByIdDescNameAsc();
    }
    

     

     

    ✔ UserReoisitoryTest 전체

     

    package com.koreait.day4.repository;
    
    import com.koreait.day4.Day4ApplicationTests;
    import com.koreait.day4.model.entity.Users;
    import com.koreait.day4.model.enumclass.UserStatus;
    import org.assertj.core.util.Lists;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import java.time.LocalDateTime;
    import java.util.List;
    import java.util.Optional;
    
    
    public class UsersRepositoryTest extends Day4ApplicationTests {
        @Autowired
         UsersRepository usersRepository;
    
        @Test
        public void create(){
            Users users = Users.builder().userid("melon").name("메에론")
                    .userpw("5555").hp("010-5555-5555").email("melon@melon.com")
                    .status(UserStatus.REGISTERED).build();
            usersRepository.save(users);
        }
    
        @Test
        public void read(){
            System.out.println(usersRepository.findNameByName("김사과"));
            System.out.println(usersRepository.findByEmail("banana@banana.com"));
            System.out.println(usersRepository.getByEmail("orange@orange.com"));
            System.out.println(usersRepository.readByEmail("bery@bery.com"));
    
            System.out.println(usersRepository.queryAppleByEmail("mango@mango.com"));
    
            System.out.println(usersRepository.findFirst3ByName("김사과"));
            System.out.println(usersRepository.findTop10ByName("김사과"));
            System.out.println(usersRepository.findLast3ByName("김사과"));
    
            System.out.println(usersRepository.findByNameAndEmail("송사과", "apple@naver.com"));
            System.out.println(usersRepository.findByNameOrEmail("송사과", "banana@banana.com"));
            System.out.println(usersRepository.findByIdAfter(2l));
            System.out.println(usersRepository.findByRegDateAfter(LocalDateTime.now())); // 사간 계산
            System.out.println(usersRepository.findByRegDateBefore(LocalDateTime.now())); // 전날
            System.out.println(usersRepository.findByRegDateAfter(LocalDateTime.now().minusDays(2L))); // 날포함한 전날
            System.out.println(usersRepository.findByIdGreaterThanEqual(2l));
            System.out.println(usersRepository.findByIdGreaterThanEqualAndIdLessThanEqual(2l,5l)); //2이상 5이하
            System.out.println(usersRepository.findByIdBetween(2l,5l));
    
    
            System.out.println(usersRepository.findByRegDateIsNull());
            System.out.println(usersRepository.findByRegDateIsNotNull());
    
            System.out.println(usersRepository.findByNameIn(Lists.newArrayList("반하나","체에리")));
            System.out.println(usersRepository.findByNameStartingWith("송"));
            System.out.println(usersRepository.findByNameEndingWith("과"));
            System.out.println(usersRepository.findByNameContains("사"));
    
            System.out.println(usersRepository.findByNameLike("%하%"));
    
            System.out.println(usersRepository.findTopByNameOrderByIdDesc("송사과"));
            System.out.println(usersRepository.findByOrderByIdDesc());
            System.out.println(usersRepository.findByOrderByIdDescNameAsc());
    
    
    
    
        }
        @Test
        public void selectUserid(){
            //아이디로 검색하는 로직
            Optional<Users> users = usersRepository.findByUserid("apple");
            users.ifPresent(
                    selectUser ->{
                        System.out.println("userid : " +selectUser.getUserid());
                        System.out.println("userid : " +selectUser.getName());
                        System.out.println("userid : " +selectUser.getHp());
                        System.out.println("userid : " +selectUser.getEmail());
                    }
            );
        }
    
        @Test
        public void updateUserid(){
            //아이디를 통해 데이터를 변경
            Optional<Users> users = usersRepository.findByUserid("apple");
            users.ifPresent(
                    selectUser ->{
                        selectUser.setEmail("apple@naver.com");
                        selectUser.setHp("010-1000-1000");
                        selectUser.setName("송사과");
                        selectUser.setUpdateDate(LocalDateTime.now());
                        usersRepository.save(selectUser);
                    }
            );
        }
    
        @Test
        public void deleteUserid(){
            //아이디를 통해 데이터를 삭제
            Optional<Users> users = usersRepository.findByUserid("orange");
            users.ifPresent(
                    selectUser ->{
                        usersRepository.delete(selectUser);
                    }
            );
        }
    
        @Test
        public void login(){
            //userid , hp, email
    
            Optional<Users> users = usersRepository.findByUseridAndUserpw("apple","2222");
            users.ifPresent(
                    selectUser ->{
                        System.out.println("userid : " +selectUser.getUserid());
                        System.out.println("hp : " +selectUser.getHp());
                        System.out.println("email : " +selectUser.getEmail());
                    }
            );
    
    
        }
    
    }
    

     

    ✔ Getter / Setter

     

    package com.koreait.day4.model.entity;
    
    import com.koreait.day4.model.enumclass.UserStatus;
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import javax.persistence.*;
    import java.time.LocalDateTime;
    
    @Entity
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder // 연속적으로 실행하게 해주는 기능 ex) method.method ......
    public class AdminUser {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String userid;
        private String userpw;
        private String name;
        @Enumerated(EnumType.STRING)
        private UserStatus status;
        // 레지스테이터스나 언레지스테이터스만 들어갈 수 있음
        private LocalDateTime lastLoginAt;
        private String regDate;
    }
    // getter/setter 사용 이유 : 객체 무결성 보장하기 위해, 필드에 직접
    // 접근한다면 들어갈 수 없는 값을 입력할 수 있지만 이를 이용하면 직접 접근하지 않고 확인 후 결정 가능
    
    // geter : 본 필드의 값을 숨긴 채 내부에서 가공된 값을 꺼냄
    // seter : 필드를 private로 만들어 외부의 접근을 제한한 후 
    // seter를 사용해 전달받은 값을 내부에서 가공해 필드에 넣음

     

    ✔ @Bean

    @Bean

    오래된 방식의 Java 오브젝트, 

    속성으로는 Class, Id, Scope, Constructor-arg가 있으며, ID 컨테이너에 의해 생성 및 관리된다.

    해당 클래스를 직접 만드는 것이 아닌 가져다 쓰는 클래스인 경우 @Bean을 등록해 줘야 한다(+ 공유기능,  + 유지보수)

    Java에서는 new 연산자를 사용하여 객체를 생성한다면, Spring 에서는 이를 @Bean을 이용한다.

     

    자동등록 방법 

    @ComponentScan 어노테이션은 어느 지점부터 컴포넌트를 찾으라고 알려주는 역할을 한다.

    @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈을 등록 (자동 등록 기능)

     

    @Configuration 

    컨피그로 적용을 하기 위해 사용, 이를 사용하기 위해서는 @ConfigurationPropertiesScan 어노테이션이 필요하다

    @Bean을 수동으로 등록하는 방법 중 하나이다.

    반응형