0315 - 0321
# 0315 - 0321
# 0315 - Java Stream
자바 컬렉션이나 배열의 원소를 간결하고 깔끔하게 가공하기 위해 사용.
# 선언
배열, 컬렉션(list, set, map) 등을 스트림 형태로 만들기
Stream<dataType> streamName = Arrays.stream(arrName);
Stream<dataType> streamName = arrName.stream();
Stream<dataType> streamName = Stream.of('data', 'data' ...);
# 가공
스트림을 필요한 형태로 가공하기
- .boxed()
- .count()
- .sorted() *(Comparator.reverseOrder())
- .findFirst()
- .skip(arrLength - 1).findFirst()
- .skip(idx)
- .limit(idx)
- .distinct()
- .max(dataType::compare)
- .min(dataType::compare)
- .average()
- .sum()
- .map((param) -> {code})
- .forEach((param) -> {code})
- .anyMatch((param) -> {code})
- .noneMatch((param) -> {code})
- .allMatch((param) -> {code})
- .filter((param) -> {code})
- .reduce(값, 데이터타입::sum)
# 반환
가공한 값을 원하는 형태로 가져오기
- .toArray();
- .collect(Collectors.toList());
- .collect(Collectors.counting());
- .collect(Collectors.joining("|"));
# 0316 - Java startsWith(), endsWith()
# startsWith(String prefix)
- str.startsWith("checkStr");
# endsWith(String suffix);
- str.endsWith("checkStr");
# 0317 - CORS
교차 출처 리소스 공유(Cross-Origin Resource Sharing)
# Simple Request
-> 응답 헤더에 Access-Control-Allow-Rogin
값만 세팅 해주면 된다
# Preflight Request
OPTIONS 방식으로 먼저 요청을 날리고, 그 이후에 실제 요청을 함.
- 응답 헤더에
Access-Control-Allow-Methods
에OPTIONS
값 설정 - 응답 헤더에
Access-Control-Allow-Headers
에content-type
값 설정 - 추가 적으로 CORS의 성능 효율을 위해서
Access-Control-Max-Age
값을 설정 할 수 있다
# Sptring boot Java Config
- WebMvcConfigurer를 통해 적용 방식
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600L);
}
}
- @CrossOrigin 어노테이션을 통해 적용하는 방식
@SpringBootApplication
//해당 컨트롤러의 모든 요청에 대한 접근 허용(아래 도메인 두개에 대해서만..)
@CrossOrigin(origins = {"http://localhost:18080", "http://localhost:8180" })
@RestController
public class CorssampleApplication {
//아래와 같이 특정 메소드에만 적용할수도 있다.
//@CrossOrigin(origins = {"http://localhost:18080", "http://localhost:8180" })
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/my")
public String my() {
return "my";
}
public static void main(String[] args) {
SpringApplication.run(CorssampleApplication.class, args);
}
}
# 0318 - Filter와 Interceptor의 차이
Filter와 Interceptor는 실행되는 시점이 다르다.
Filter는 Web Application에 등록을 하고, Interceptor는 Spring의 Context에 등록을 한다.
# Interface
- Filter
public interface Filter {
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
}
- HandlerInterceptor
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav);
void afterCompletion(HttpServletRequest request, HttpServeletResponse response, Object handler, Exception ex);
}
Filter는 Servlert에서 처리하기 전후를 다룰 수 있다.
Interceptor는 Handler를 실행하기전, 실행한 후, view를 렌더링한 후 등, Servlert내에서도 메서드에 따라 실행 시점을 다르게 가져간다.
- Interceptor에서만 할 수 있는것
- AOP 흉내를 낼 수 있다.
@RequestMapping
선언으로 요청에 대한HandlerMethod(@Controller의 메서드)
가 정해졌다면, handler라는 이름으로HandlerMethod
가 들어온다HandlerMethod
로 메서드 시그니처 등 추가적인 정보를 파악해서 로직 실행 여부를 판단할 수 있다 - View를 렌더링하기 전에 추가 작업을 할 수 있다
- AOP 흉내를 낼 수 있다.
- Filter에서만 할 수 있는 것
ServletRequest
혹은ServletResponse
를 교체할 수 있다. 아래와 같은 일이 가능하다
public class SomeFilter implements Filter {
//...
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
chain.doFilter(new CustomServletRequest(), new CustomResponse());
}
}
-> 커스터마이징 된 ServletRequest를 사용할 때
# 0319 - Git Merge와 Rebase 차이점
Merger는 branch를 통합하는 것이고, Rebase는 branch의 base를 옮긴다는 개념의 차이
# Rebase
- 해당 branch의 base를 재설정하고 커밋을 새롭게 정렬
- commit tree가 달라진다 즉 git history를 정리 할 수 있다
# 0321 - Call by value와 Call by reference
# call by value
값에 의한 호출
함수가 호출될때, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성됨(종료 시 삭제)
call by value 호출 방식은 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달함
이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가짐
따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경 안됨
# call by reference
참조에 의한 호출
call by reference 호출 방식은 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달함
따라서 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 변경됨
# Java call by reference
사실 자바는 Call by value이냐, Call by reference이냐 로 의견이 분분 더 알아봐야겠다