자바 8에서 새로 추가된 기능 Optional 를 어떻게 사용하는지 알아보자. Member member = new MemberRepository(member.findById(id)); if(member != null){ ... }else{ ... } findById 메소드가 member 타입의 객체를 리턴한다고 하면, 만약 member가 null일 경우를 대비해 이렇게 코딩을 해야한다. findById가 member타입 객체 말고, Optional타입의 객체를 리턴하게 한다면? // 안 좋음 List members = team.getMembers(); return Optional.ofNullable(members); // 좋음 List members = team.getMembers(); return me..
@ResponseBody 문자 반환 @controller public class HelloController{ @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name){ return "hello " + name; } } @ResponseBody를 사용하면 뷰 리졸버 (ViewResolver)를 사용하지 않음 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님) @ResponseBody @Controller public class HelloController{ @GetMapping("hello-api") @ResponseBody publ..
String, Integer, Double 등 클래스 내부에는 모두 compare 메소드가 내장 되어있다. 기본적으로 오름차순으로 제공하고 있다. 만약 내림차순으로 정렬을 하고 싶다면, 매개변수의 순서를 바꿔주면 된다. 이 int compare 메서드를 간단히 설명하자면, 정렬이 진행될 때 자리바꿈(=정렬) 여부를 결정하는 값을 넘겨주는 역할을 한다. 만약 return값이 0이나 음수이면 자리바꿈을 하지 않고, 양수이면 자리바꿈을 수행한다. 만약 오름차순이 아니라 내림차순으로 정렬하고 싶다면 매개변수의 순서를 바꿔주면 된다. compare 메소드 코드 @Override public static int compare(int x, int y) { return x < y ? -1 : ((x == y) ? 0 ..
인터페이스의 default method 인터페이스의 default 메소드 JAVA 8이 등장하면서 interface에 대한 정의가 몇 가지 변경되었다. default메소드 인터페이스가 default키워드로 선언되면 메소드가 구현될 수 있다. 또한 이를 구현하는 클래스는 default메소드를 오버라이딩 할 수 있다. public interface Calculator { public int plus(int i, int j); public int multiple(int i, int j); default int exec(int i, int j){ //default로 선언함으로 메소드를 구현할 수 있다. return i + j; } } //Calculator인터페이스를 구현한 MyCalculator클래스 publ..
스프링 프레임워크 5에 추가된 Null 관련 애노테이션 org.springframework.lang.* @NonNull @Nullable @NonNullApi (패키지 레벨 설정) @NonNullField (패키지 레벨 설정) 목적 (툴의 지원을 받아) 컴파일 시점에 최대한 NPE(NullPointerException)을 방지하는 것 null 체크를 하지 않아서 생기는 NPE 방지 @NonNull org.springframework.lang.NonNull 사용 메소드 파라미터에 붙이는 경우 -> null 값이 들어오지 못하도록 방지 @Service public class EventService { @NonNull // (1) public String createEvent(@NonNull String na..
애노테이션 기반의 스프링 @AOP 의존성 추가 org.sringframework.boot spring-boot-starter-aop Aspect 정의 @Aspect 빈으로 등록해야 하니까 (컴포넌트 스캔을 사용한다면) @Component도 추가 포인트컷 정의 @PointCut(표현식) 주요 표현식 execution @Service public class SimpleEventService implements EventService{ @Override public void createEvent() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("create an Eve..