Stream의 forEach는 요소를 돌면서 실행되는 stream 연산의 최종 작업이다. 보통 System.out.println 메소드를 넘겨서 결과를 출력할 때 사용한다. 종료 조건이 있는 로직을 구현할 때 주의해야 한다. Stream 자체를 강제적으로 종료시키는 방법은 없다. 무언가 강제적인 종료 조건에 대한 로직이 있는 for-loop를 stream.forEach()로 구현한다면, 기존 for-loop에 비해 비효율이 발생한다. 스트림 병렬화에 대한 공식 문서의 Side-effects 항목을 참고하면, forEach 내부에 로직이 하나라도 더 추가된다면 동시성 보장이 어려워지고 가독성이 떨어질 위험이 있다. 또한 Stream의 의도를 벗어나게 된다. 본래 forEach는 스트림의 종료를 위한 연산이..
👉 SQL Injection 정의 KISA 홈페이지에 가면 시큐어 코딩가이드를 제공한다. 출처: https://www.kisa.or.kr/public/laws/laws3_View.jsp?mode=view&p_No=259&b_No=259&d_No=55&ST=T&SV= 👉 SQL Injection 처리해야하는 경우 안전한 코딩기법으로 'preparedStatement 클래스를 사용할 수 없는 환경이라면, 입력값을 필터링 처리한 후 사용한다.' 라고 적혀있다. MyBatis를 예시로 보자 - #{}는 내부적으로 PreparedStatement를 사용하기 때문에 SQLInjection 공격에 안전하다. - mybatis에서 ${} 는 컬럼명을 쿼리에 그대로 쓸때 사용되는데 SQLInjection 공격에 취약하기..
Local variable userId defined in an enclosing scope must be final or effectively final long userId = -1; if(...){ userId = updateUser(); }else{ userId = insertUser(); } userList.removeIf(t->t.getUserID()==userId); 위처럼 람다식을 사용하려다가 에러가 났다. removeIf 안의 userId변수가 final 이거나 effectively final이여야 한다고 한다. 이유를 찾아보았다. 람다식에서는 다른 스레드에서 호출될때 변수가 스택영역에서 사라질것을 대비하여 자유변수의 복사본을 만들어 접근을 허용하도록 하게 한다. 이를 람다 캡쳐링(cap..
출처: https://happy-playboy.tistory.com/entry/%EB%B0%B1%EC%88%98%EC%9D%98-%EC%8A%A4%ED%94%84%EB%A7%81-IoC%EC%99%80-DI%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C IoC(Inversion of Control) IoC란 말 그대로 제어의 역전, 즉 제어권이 바뀌었다는 것이다. 이는 객체의 생성부터 소멸까지 생명 주기의 관리를 개발자가 아닌 컨테이너가 대신 해준다는 것이다. 그 덕분에 개발자가 직접 객체를 주입하며 신경써야했던 코드들을 줄일 수 있다. IoC에는 아래 그림과 같이 크게 DL(Dependency Lookup)과 DI(Dependency Injection)이 있다. 이에 대해 조금 더 ..
출처: https://sowells.tistory.com/170 CORS(Cross Origin Resource Sharing) 다른 오리진(Cross origin)으로의 요청은 보안상의 이유로 제한된다. 요청을 정상적으로 보내려면(CORS를 하려면) 별도 추가 작업이 필요하다. CORS 과정 from.com에서 POST to.com/myApi라는 리소스를 요청한다고 하자. Preflight 요청 본 요청을 보내기전에 서버(b.com)가 요청하는 리소스에 CORS를 허용하는 지를 확인하는 Preflight 요청을 보낸다. OPTIONS /myApi Access-Control-Request-Method: POST Access-Control-Request-Headers: origin, x-requested-..
1. 일단은 스케줄러 구현에 대해 잘 정리되어있는 블로그를 스크랩한다. https://devmg.tistory.com/137 Spring으로 배치 만들기 (quartz, scheduler,task) 스프링에는 일괄 처리(batch processing) 배치를 만드는 여러가지의 기능이 있다. 방법1. quartz 스케줄링 객체 사용 방법2. 설정 사용 방법3. @Scheduled 어노테이션 사용 실행환경 Spring4 / java 1.8 org.quar.. devmg.tistory.com 2. 조졸두 님의 Spring Batch 시리즈 https://jojoldu.tistory.com/324?category=902551 1. Spring Batch 가이드 - 배치 어플리케이션이란? Spring Batch ..
API 게이트웨이 API 게이트웨이는 API서버 앞단에서 모든 API 서버들의 엔드포인트를 단일화하여 묶어주고 API에 대한 인증과 인가 기능에서 부터 메세지에 따라서 여러 서버로 라우팅 하는 고급기능 까지 많은 기능을 담당할 수 있다. 기능 기능들을 살펴보자 1. 인증과 인가 기능 그림과 같이 토큰을 API게이트웨이가 저장하고 인증을 해준다. API 서버가 아무리 많아도 인증 구현은 API게이트웨이에서 딱 한번만 하면 되는 장점이 있다. 2. 미터링 간혹 API호출 횟수로 과금을 부여하는 서비스가 있다. 이러한 서비스들이 API게이트웨이 미터링 기능을 사용한다. API 게이트웨이를 가장 앞단에 놓고 API 서버들의 호출이 아닌 API게이트웨이 하나의 호출로 횟수를 카운팅하는 것이다. 3. 로깅 설명은 ..
빈의 Scope는 singleton, prototype, request, session, global session 이 될 수 있다. 각각의 Scope에 따른 특성은 아래와 같다. singletone: 기본적으로 singletone 이다 prototype: (scope="prototype") 옵션을 주면 매번 해시코드가 다른 bean 객체가 생성된다. 정상적인 방식으로 gc에 의해 bean이 제거된다. 예제 public class Student { private String name; private int age; public Student() { System.out.println("기본 생성자-객체 생성"); } public Student(String name, int age) { super(); th..
- Total
- Today
- Yesterday
- 백준
- 퇴사
- 프론트엔드개발자
- html
- 개발중캐시삭제
- C# java 차이점
- 선언적트랜잭션 #noRollbackFor #@Transactional
- c#
- 프론트엔드
- 캐시삭제
- script버전
- 런타임에러
- html꿀팁
- 백준14501
- C++
- 백준퇴사
- boj
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |