본문 바로가기

분류 전체보기270

[Java] Boxing을 지양하자.(feat primitive type vs reference type) 모던 자바 인 액션을 공부하는 요즘 왜 자바에 더 집중하지 않았는가에 대한 자아성찰을 많이 하는 중이다. 흔히 말하는 Boxing, unBoxing은 다들 알고있다고 생각한다. 간단하게 말해서, Wrapper Class를 사용해서 primitive Type을 reference Type으로 변환하는 과정을 박싱(Boxing), 이 반대의 과정을 언박싱(unBoxing)이라고 한다. 자바에서는 오토박싱 기능을 제공해주기도한다. 그렇다면 왜 Boxing을 지양해야할까? 결론부터 말하자면, 비용이 추가적으로 발생 한다. 박싱한 값(Wrapper class)은 reference Type이다. 고로 Heap 영역에 저장된다. 그렇기 때문에, primitive Type을 가져오려고할 때도 Wrpper class로 인.. 2021. 4. 8.
[Java] 자바8 default, static 메소드 자바8에서의 인터페이스 기존 자바7 이하에서는 추상 메소드 선언과 상수 정의만 가능했다. 그런데 자바8부터 default 메소드와 static 메소드를 추가 정의할 수 있게됐다. 왜 생겼을까??? default 메소드 왜 생겼지? 하위호환성과 유연성 때문. 만약 자바 7에서 자바8로 업데이트하면서 인터페이스 새로운 메소드가 추가되었다면? 해당 인터페이스를 구현한 모든 클래스에서 해당 메소드를 구현해줘야한다. (너무 불편..) 객체지향의 개방폐쇄원칙에 위배된다. 그래서 default 메소드로 기본 구현을 제공해줌으로써, 새로 구현하지 않아도 된다. public interface Calculator { public int plus(int i, int j); public int minus(int i, int .. 2021. 3. 20.
[Java] 주니어 백엔드 면접 단골 질문 - 쓰레드를 생성하는 2가지 방법 면접에서 쓰레드에 대한 질문을 높은 빈도로 받았었다. 만족하실만한 대답을 못했던 것 같다. 쓰레드를 생성하는 2가지 방법 Runnable 인터페이를 확장해 run() 메소드 구현 Thread 클래스를 상속받고 run() 메소드를 오버라이딩해 구현 둘 중에 뭐가 더 좋을까?? Runnable 인터페이스를 확장하는 방법. 왜? extends과 implements의 차이점에서 알 수 있다. extends을 받으면 내가 받고 싶지 않은 메소드도 상속 받게 되는 문제가 생긴다. 또한 private가 아닌 메소드나 변수를 자식 클래스가 받게 되고 낭비가 생긴다. 따라서 인터페이스 확장 방식을 사용해 필요한 기능만 갖게 되고 결합도를 낮추는 방식이 객체지향적으로 적합하다. 쓰레드를 실행시키는 방법은? 1) exten.. 2021. 3. 20.
[Spring] bean scope prototype TroubleShooting (feat, connection) 빈 생명주기에 관해서 그래도 기본은 알고있다고 생각했는데 큰 오산이었다. 운영에 반영을 했는데 몇 일 뒤 최대 Connection을 초과해서 장애가 발생하였다. 원인은 Connection close가 되지 않아서였다. AS-IS TO-BE 왜?? 소스를 어떻게 짰길래?? 샘플 소스로 확인해보자. AServiceImpl는 매번 새로운 커넥션을 맺고 사용이 끝나면 자원을 close 하는 역할을 하고 있다. common.xml에 Impl 클래스를 prototype으로 빈을 등록해놓았다. 그리고 다른 클래스에서 매번 새로운 인스턴스로 사용하기 위해서 beanFactory에서 getBean을 통해 직접 해당 클래스를 가져왔다. @Autowired private AutowireCapableBeanFactory be.. 2021. 1. 19.
[MSA] API Gateway - 머리부터 발끝까지(3) 저번 글에 이어서 Client1을 작성해보자 간단하게 Request를 받을 컨트롤러만 작성하여 데이터를 확인해보자. Client1Controller @Slf4j @RestController @RequestMapping("/client1") public class Client1Controller { @GetMapping(value = "/ping") public Mono getData(ServerHttpRequest request, ServerHttpResponse response){ log.info("getData Method"); HttpHeaders headers = request.getHeaders(); headers.forEach((k,v) ->{ System.out.println(k + " : .. 2021. 1. 18.
[MSA] API Gateway - 머리부터 발끝까지(2) API Gateway개념 [MSA] API Gateway - 머리부터 발끝까지(1) 회고 글에서 적었듯이 올해는 MSA에 대해서 공부를 해보려한다. 그 중에 첫번째로 API Gateway에 대해 공부를 해보자. API Gateway란? MSA는 간단하게 말해서 Monolithic 구조의 서비스를 여러개의 서비스로 n1tjrgns.tistory.com 간단한 API Gateway 구축하기 환경 JAVA : 8 SpringBoot : 2.2.5 (글 작성 시점 Spring Cloud Gateway Generally Available 버전) Gradle : 6.7.1 IDE : Intellij 여러 프로젝트를 관리해야 하기 때문에 멀티모듈로 시도해보았다. build.gradle plugins { id 'org.. 2021. 1. 15.