
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 등에 의존하지 않게 합니다.