Likelion_1130

현보·2022년 11월 30일
post-thumbnail

Springboot

Controller

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/teachers")
public class TeacherController {

//    @Autowired
//    TeacherService teacherService;
    
    //@RequiredArgsConstructor 를 쓰면 final 만 DI를 해준다
    private final TeacherService teacherService;

    @GetMapping
    public String get(){
        return "Hello";
    }
}

TDD

class StudentTest {
  
    @Test
    void name() {
        List<Teacher> teachers = new ArrayList<>();
        Teacher Kyeongrok = new Teacher("김경록", true, true);
        Teacher Kyeonghwan = new Teacher("고경환", true, false);
        Teacher sujin = new Teacher("김수진", false, true);
        Teacher sohyun = new Teacher("김경록", true, true);


        teachers.add(Kyeongrok);
        teachers.add(Kyeonghwan);
        teachers.add(sujin);
        teachers.add(sohyun);
        teachers.add(new Teacher("김경", false, true));


        List<Integer> digitsOfNames = teachers.stream()
                .filter(Teacher::isLikeSpringBoot)
                .map(Teacher::cntNameDigit)
                .collect(Collectors.toList());
        System.out.println(digitsOfNames);


        // 알고리즘 true이신 분들
        System.out.println("---알고리즘 true이신 분들---");

        // DB에서 읽어왔습니다.
        List<Teacher> likeAlgorithmTeachers = teachers.stream()
                .filter(teacher -> teacher.isLikeAlgorithm() == true)
                .collect(Collectors.toList());

        System.out.println(likeAlgorithmTeachers);

        System.out.println("---SpringBoot이 true이신 분들");

        // .filter()만 썼을 때
//        List<Teacher> likeSpringBootTeachers = teachers.stream()
//                .filter(teacher -> teacher.isLikeSpringBoot() == true)
//                .collect(Collectors.toList());
//
//        for (Teacher teacher : likeSpringBootTeachers){
//            System.out.println(teacher.getName());
//        }

        // .filter(),map()을 썼을 때
        List<String> likeSpringBootTeachers2 = teachers.stream()
                .filter(teacher -> teacher.isLikeSpringBoot() == true)
                .map(teacher -> teacher.getName())
                .collect(Collectors.toList());

        for (String teacherName : likeSpringBootTeachers2) {
            System.out.println(teacherName);
        }



    }


    // .reduce - Collection을 연산해서 한개의 값으로 만들어주는 연산
    @Test
    void reduce() {

        String[] list = {"1", "2", "3"};
        List<Integer> nums = Arrays.stream(list)
                .map(strNum -> Integer.parseInt(strNum))
                .collect(Collectors.toList());

        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums.get(i);
        }
        System.out.println(sum);

        int reduceSum = Arrays.stream(list)
                .map(strNum -> Integer.parseInt(strNum))
                .reduce(0, (a, b) -> a + b); // 재귀와 흡사합니다.
        System.out.println("reduceSum : " + reduceSum);
    }


    //Optionl.of() → Optional로 감쌀 때
    //.findByUserName() → Option.of() 값이 있으면 감싸줍니다.
    //Optional.empty() → 값이 없는 것을 표현할 때
    @Test
    void optionalTest() {
        // DB에서 select되어 값이 있는 상태
        Optional<Teacher> optionalTeacher = Optional.of(new Teacher("김경록", true, true));
        Optional<Teacher> emptyTeacher = Optional.empty();

        List<Teacher> teachers = new ArrayList<>();
        teachers.size(); // --> 값이 없으면 0


        // get
        Optional<Teacher> optionalTeacher3 = Optional.of(new Teacher("김경록", true, true));
        Teacher teacher = optionalTeacher3.get(); //값이 있는 경우

        // 값이 없는 경우 get
        Optional<Teacher> emptyTeacher2 = Optional.empty();
        emptyTeacher2.get();
        emptyTeacher2.orElseThrow(RuntimeException::new);
        Teacher teacher1 = emptyTeacher2.orElseThrow(() -> new RuntimeException());


        // 값이 있는 경우 무언가 처리 하고 싶을 때
        Optional<Teacher> optionalTeacher4 = Optional.of(new Teacher("김경록", true, true));
        optionalTeacher4.ifPresent(sth -> {
            throw new RuntimeException(sth.getName()); // throw new HospitalReviewAppException(ErrorCode.DUPLICATED_USER_NAME, String.format("UserName:%s", request.getUserName()));
        });

        // .ofNullable, orElse()
        Optional<Teacher> optionalTeacher5 = Optional.of(new Teacher(null, true, true));
        String name = Optional.ofNullable(optionalTeacher5.get().getName()).orElse("이름이 없습니다.");
        System.out.println(name);
    }
}

.map
.map의 3단계 활용법
.map(teacher -> teacher.getName().length()) // 1단계 map에서 처리
.map(teacher -> teacher.cntNameDigit()) // 2단계 함수 내장
.map(Teacher::cntNameDigit) // 3단계 ::문법 적용


.reduce
Collection을 연산해서 한개의 값으로 만들어주는 연산


.collectToList()
.map()연산을 한 후 map()연산의 타입으로 List를 다시 만들고 싶은 경우

어노테이션

@Getter → 필드 get 메서드 자동 추가

@AllArgsConstructor -> 필드 변수 모두 생성자로

@RequiredArgsConstructor -> DI(의존성 주입)의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션
->초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다.

@WebMvcTest
—> Spring을 안띄우(new 최소한으로 한다는 것)고도 Service만 Test할 수 있습니다.
SpringBoot을 쓰면 Test가 어려워지는 구간이 발생합니다.
Service에서 Spring 종속성이 안들어가게 개발 해야 합니다.
→ DTO를 써서 직접 @Entity, Repository 등에 의존하지 않게 합니다.

0개의 댓글