전체 글 199

if-else 과 switch 어느 것이 효율적일까?

갑자기 분기 코드를 짤 때 if-else 를 쓰는 것이 더 경제적일지, switch 문을 작성하는 것이 경제적일지 궁금해서 찾아본 결과, 결론부터 말하자면 분기의 수가 많다면(약 5개 이상?) switch 문으로 작성하는 것이 더 낫다고 한다. 그 이유는 switch 문으로 분기의 수가 많다면( 약 5개 이상? 정확한 숫자는 모르겠다. 글마다 조금씩 다름) 컴파일러가 branch table(또는 jump table)을 빌드하여 수행 속도가 더 빠르다고 한다. 분기의 수가 적다면 딱히 차이는 나지 않지만, 수가 많아질수록 성능 차이가 발생할 수 있다고 한다. * 문자열 비교에서의 switch 문 문자열을 다루는 일이 생각보다 많다보니, swtich 문을 적용할 일이 생겼는데 이러한 상황에 고려해야하는 것들..

JAVA 2022.02.25

JAVA 정규식 표현과 정규식

* 정규식이란? 정규식(regular expression: regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. * JAVA 정규식의 사용 정규식은 java.util.regex의 Pattern 과 Matcher 클래스를 주로 이용한다. Pattern은 말 그대로 어떤 문자열에서 찾을 패턴을 뜻한다. 문자열(String)의 정규식은 먼저 Pattern 인스턴스로 컴파일 되어야 한다. 그런 다음 Matcher를 이용, 일치하는 개체를 만들 수 있다. 일반적인 호출 순서는 다음과 같다. Pattern p = Pattern.compile("a*b"); // a와 b 사이에 문자가 있을 수도 없을 수도? Matcher m = p.matcher("aaaaab"); Matcher m..

JAVA 2022.02.23

Exception (예외)

Exceptions (예외) Exception은 프로그램의 실행 중에 발생하는 기대하지 않았던 이벤트. 프로그램의 정상적 실행을 방해한다. exception이 발생하는 원인은 다양하다: 코드 에러 잘못된 입력 유효하지 않은 파일 접근 네트워크 연결 오류 물리적인 제한 (디스크 메모리의 부족) exception(예외)는 처리가 가능하다. Error(오류) Error는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 예를 들어 JVM의 메모리 부족, 스택 오버플로우, 메모리 누수(memory leak)과 같은 복구할 수 없는 상태를 나타낸다. 프로그래머가 미리 예측할 수 없기 때문에 처리할 수 없어서 신경쓰지 않아도 된다. (처리할 수 없으니까) StackOverFlowError, OutOfMemoryErr..

JAVA 2022.02.13

TLS10 is not accepted by client preferences [TLS12] 오류 해결

서버 코드를 깃허브에서 다운 받은 후 로컬에서 구동시키려고 하는데 TLS10 is not accepted by client preferences [TLS12] 라는 에러 메세지와 함께 구동이 안되었다. 나의 경우엔 아마 DB 연결에 TLS 관련된 뭐가 있는데 TLS10으로 DB에 못붙으면서 뱉는 에러 같았다. 해결 방법은 1. JDK가 설치된 폴더의 경로로 이동한다. 2. JDK 안의 JRE 폴더의 lib\security에서 java security 파일을 수정한다. 3. jdk.tls.disabledAlgorithms 을 검색해서 나오는 부분 중 TLS 1, TLS1.1을 지워주면 된다. jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5w..

Web 2022.01.08

2022 새해가 밝았다.

2021년이 된지 얼마 안된 것 같은데 어느새 2022년이 되었다. 사실 새해의 해가 떠오른지는 이틀 정도 되었지만 이틀 동안 제정신이 아니었으므로 지금 2021년의 회고와 새해의 목표를 정리한다. 2021년을 되돌아보면 내 인생에서 가장 노력했던 한 해가 아닐까 싶다. 싸피에 입소해서 나름? 열심히 했다. 스터디도 매일 참석했고 블로그도 1일1포스팅을 하려고 노력했다. 그래서 그런지 잠을 제대로 못자서 만성 면역질환을 얻었고... 어쨌든 뭐든지 득과 실은 있는거니까. 그래도 평생 약을 먹어야 한다고 생각하면 좀 괴롭기도 하고 아무튼 그렇다. 새로운 사람들도 많이 만났고 개발 외적인 부분에서도 많이 배울 수 있었다. 대부분 타산지석 삼아 여러가지를 배웠다. 그 중 가장 큰 한가지는 그냥 말은 되도록 안하..

후기 및 잡담 2022.01.02

@PostConstruct 의 사용 이유

@PostConstruct란? 종속성 주입이 완료된 후 실행되어야 하는 메서드에 사용된다. 이 어노테이션은 다른 리소스에서 호출되지 않아도 수행된다. @PostConstruct의 사용 이유 1) 생성자가 호출되었을 때, 빈은 초기화되지 않았음(의존성 주입이 이루어지지 않았음) 이럴 때 @PostConstruct를 사용하면 의존성 주입이 끝나고 실행됨이 보장되므로 빈의 초기화에 대해서 걱정할 필요가 없다. 2) bean 의 생애주기에서 오직 한 번만 수행된다는 것을 보장한다. (어플리케이션이 실행될 때 한번만 실행됨) 따라서 bean이 여러 번 초기화되는 걸 방지할 수 있다. @PostConstruct의 사용 예 @Component public class DbInit { @Autowired private ..

Spring (Boot) 2021.12.26

Filter 와 Interceptor의 차이점

필터와 인터셉터 둘 다 막연하게 늬앙스 자체가 뭔가... 들어오는 요청을 한 번 걸러주는 역할을 한다고 두루뭉실하게 생각했었다. 그래서 한번 정확하게 역할을 정의하고 분석할 필요가 있다고 생각되어 따로 포스팅을 하게 되었다. * 필요한 사전 지식 스프링은 디스패처 서블릿이 핸들러 매핑을 통해 해당 요청을 처리할 적절한 컨트롤러를 찾는다. Filter - web application에 등록이 된다. 필터는 스프링 프레임워크의 일부가 아닌 웹 서버(ex. 톰캣)의 일부이다. 따라서 DispatcherServlet 앞단에 위치하며 정보를 처리해준다. 필터를 사용해서 서블릿에 정보가 도달하지 못하도록 막을 수도 있고, 서블릿을 통과한 클라이언트에게 가는 응답을 차단할 수도 있다. filter에서 예외가 발생하면..

Spring (Boot) 2021.12.07

IntelliJ 단축키 설정

인텔리제이를 처음 사용하고 느꼈던 것은 단축키와 자동완성이 정말 편리하다는 것이다. sts는 자동완성이 되긴 하지만 잘 안되다보니... 거의 모든 코드를 내가 직접 입력했던 것 같은데 인텔리제이는 자동완성이 워낙 잘되어있어 마치 내가 다음에 뭘 입력할지를 미리 예측하고 자동 완성을 해주는 것 같은 느낌까지 든다. 어쨌든 이러한 인텔리제이의 장점을 살리기 위해서 단축키도 여럿 정리해보았다. 개발할 때 요정도만 알고 있어도 크게 불편함은 없는 듯 하다. 만약 이 중에서 손에 안 익는 단축키가 있거나, 추가하고 싶은 단축키가 있다면 setting > keymap에서 설정을 해주면 된다. shift * 2 : 파일 탐색 ctrl + shift + f : 문자열 검색 alt + 방향키 : 파일간 이동 ex) al..

JAVA 2021.11.30

OAuth 2.0

* OAuth 2.0 개요 OAuth는 인증 계층을 도입하여 클라이언트의 역할과 리소스 소유자의 역할을 분리한다. OAuth에서 클라이언트는 제어되는 리소스에 대한 액세스를 요청한다. 그럼 리소스 소유자가 요청의 검증을 직접 하는 것이 아닌, 클라이언트는 3rd party clients(OAuth)에게서 액세스 토큰(access token)을 발행받는다. 이 access token은 보호되고 있는 resource server로부터 보호되고 있는 리소스의 접근에 사용된다. OAuth에서 로그인 뿐만 아니라 데이터 접근 권한도 포함하고 있기 때문에, Auth는 Authentication(인증) 뿐만 아니라 Authorization(인가)도 포함하는 개념이다. Authentication vs Authoriza..

Web 2021.11.07

백엔드 서버 배포 후 재빌드할 때

1. ps -ef | grep java 명령어로 현재 돌고 있는 java 프로세스 확인 -> pid도 같이 나옴 pid 251012, 252672인 프로세스 2개 확인 -> 251012 프로세스를 kill 2. kill -9 251012 프로세스 죽이기 3. sudo rm -rf target target 폴더가 빌드된 ? 프로젝트가 들어있는 폴더인데 삭제 4. mvn package 메이븐을 사용하는 프로젝트의 경우, mvn package를 사용하여 재빌드, gradle은 또 다른 명령어가 있음 백엔드 배포 과정을 정리하자면, 1. 로컬에서 개발하다가 깃으로 커밋 & 푸쉬 2. 배포된 서버 환경에서 git pull origin 받으려는 branch 3. 프로젝트 재빌드 +) 빌드 이후에 502 게이트웨이 ..

Web 2021.08.17