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-MethodsOPTIONS 값 설정
  • 응답 헤더에 Access-Control-Allow-Headerscontent-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를 렌더링하기 전에 추가 작업을 할 수 있다
  • 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이냐 로 의견이 분분 더 알아봐야겠다

Last update: September 13, 2022 21:44
Contributors: ahnjs , jaesungahn91