분류 전체보기 46

이펙티브 파이썬 2nd 정리 #2

18. __missing__을 사용해 키에 따른 디폴트 값을 생성하는 방법을 알아두라 ✅ setdefault, defaultdict를 사용하기 적당하지 않은 경우 __missing__을 사용하라 디폴트 값을 만드는 계산 비용이 높거나 만드는 과정에서 예외가 발생할 수 있는 상황에서는 dict의 setdefault 메서드를 사용하지 않는것을 권장한다. defaultdict에 전달되는 함수는 인자를 받지 않는다. 따라서 접근에 사용한 키 값에 맞는 디폴트 값을 생성하는 것이 불가능하다. 디폴트 키를 만들때 어떤 키를 사용했는지 반드시 알아야 하는 상황이라면 직접 dict의 하위클래스와 __missing__ 메서드를 정의하여 해결할 수 있다. # setdefault, defaultdict를 사용하기 적당하지 ..

python 2023.08.05

이펙티브 파이썬 2nd 정리 #1

5. 복잡한 식을 쓰는 대신 도우미 함수를 작성하라 ✅ 다른 언어에서는 처리하기 위해 if문을 사용하거나 별도 함수를 선언하여 처리할 수 있다. 하지만 파이썬에서는 이런 방식보다는 if expression을 사용하는게 깔끔하다. 빈 문자열, 빈 리스트, 0은 모두 False로 인식된다. red = my_values.get('빨강',[''])[0] or 0 green = my_values.get('초록',[''])[0] or 0 opacity = my_value.get('투명도', [''])[0] or 0 ✅ 조건을 판단하는 등 반복되는 로직이 있다면 별도의 함수를 작성해서 옮겨라. 비록 두세 번 밖에 사용되지 않더라도 작성하는걸 권장한다. def get_first_int(values, key, defal..

python 2023.07.28

동기와 비동기, Java Synchronized

정의 동기화 동일한 객체나 메소드에 먼저 접근한 쓰레드가 작업을 마칠때까지 나머지 쓰레드는 작업을 수행하지 않고 기다리는 역할을 말한다. 동일한 객체에 접근했을때 먼저 접근한 쓰레드가 작업을 마치기 전까지 다른 쓰레드에 의해서 방해받지 않도록 하는것을 말한다. 프로세스(쓰레드)가 수행되는 시점을 조절하여 프로세스(쓰레드)간 알고 있는 정보가 일치하도록 하는것을 말한다. 정리 : 다수의 작업이 있더라도 순차적으로 작업을 처리하는 방식을 말한다. / 공유자원(객체)을 상대로 순서대로 작업이 이루어지도록 처리하는 방법을 말한다. 비동기 요청과 결과가 동시에 일어나지 않는다를 의미한다. 요청을 보냈을때 응답상태와 상관 없이 다음 동작을 수행하며 응답을 기다리는것이 가능하다. 예시를 들어보자면, 쇼핑몰에서 우측하..

Java 2022.05.28

[Benchmark] NoSQL - Geo Index가 위치데이터 연산에 유리한 이유

2019-07-08 ~ 2019-07-29 간 진행한 내용입니다. 목차 연구배경 및 요약 벤치마크 시나리오 벤치마크 결과 분석 결론 1 - 연구배경 및 요약 ArangoDB는 Geo Index를 포함하여 다양한 Index를 지원한다. 그 중에서 다른 DB에서는 흔히 보기 어려운 Geo Index에 대해서 궁금해졌고, 위치 데이터 연산을 하는 상황에서 실제로 Geo Index가 기존에 많이 쓰이는 다른 Index와 비교해서 속도가 더 빠른지 벤치마크를 통해서 검증해보고 그에 대한 이유를 분석했다. 2 - 벤치마크 시나리오 2 - 1) 시나리오 매번 랜덤한 위치를 중심으로 일정범위(1km) 내 데이터를 최대 300건까지 조회하는 상황 배달의 민족,1km 같은 위치기반 데이팅 어플과 비슷한 경우를 가정함 Ge..

Server 2022.05.25

Servlet서블릿

정의 자바로 웹페이지를 동적으로 생성하는 서버측 프로그램 or 사양을 말한다. 클라이언트의 요청을 처리하고 그 결과를 반환하는 servelt class의 구현규칙을 지킨 자바 웹 프로그래밍 기술 자바를 사용하여 웹을 만들기 위해 필요한 기술. 클라이언트가 페이지를 요청하면 결과를 전송해줄때 사용되는 자바 기술. 자바로 구현된 CGI라고 부르기도 한다. 정리 : 자바에서 클라이언트요청을 처리하고 그 결과를 반환하는 웹 프로그래밍 기술이다. http request/response를 해석하고 처리해주는 일을 대신해준다. 특징 동적으로 페이지를 제공하기 위해 사용한다. 사용 urlPatterns = “/test” 가 호출되면 서블릿이 실행된다. HttpServletRequest/HttpServletRespons..

Java 2022.05.25

동등성과 동일성의 차이

정의 객체는 동일성(indentity) 비교와 동등성(equality)비교라는 두 가지 비교 방법이 있다. 차이 동일성 동일성 비교는 ==비교다. 객체 인스턴스의 주소 값을 비교한다. equals를 별도로 overriding하여 구현하지 않은 경우 ObjectClass의 equals()가 호출되며 여기서 equals()는 동일성을 비교한다. public boolean equals(Object obj) { return (this == obj); } 동등성 동등성 비교는 서로 다른 인스턴스이지만 객체 내부의 값이 같은지를 비교한다. 동등성 비교를 위해서는 equals()를 Override해야한다. 결론 동일성과 동등성 비교의 차이는 두 객체가 같은 인스턴스인지 아닌지를 확인하는것이다.

Java 2022.05.25

Spring MVC구조 - 내부HTTP요청처리과정

개요 HTTP Request가 Spring에 들어왔을때 처리되는 과정과 순서를 정리한다. 순서 HTTP요청 → Filter(설정되어있는경우) → DispatcherServlet → HandlerMapping → Controller(service포함하는 비즈니스로직) → DispatcherServlet → HTTP응답 클라이언트에서 HTTP요청을 보낸다 필터가 설정되어 있는경우에만 서블릿 필터가 실행된다 WAS에서 HTTP요청을 기반으로 HttpServletRequest, HttpServletResponse객체를 생성하여 DispatcherServlet에게 전달한다. DispatcherServlet은 HandlerMapping에게 요청을 처리할 Controller(Handler)를 찾도록 지시한다. Han..

spring 2022.05.24

JVM - java버전별 변경점

JAVA7 메모리구조 변경사항 : Permanent영역이 별도로 존재했다. JAVA8 메모리구조 변경사항 : Permanent영역이 제거되고 Native영역으로 이동하여 MetaSpace영역으로 변경되었다. Permanent영역에 저장되던 static object들은 Heap영역으로 옮겨져 GC의 대상이 됐다. 기존 permanent영역은 JVM에 속한 영역으로 크키가 고정되어있었는데 meta space로 옮겨가며 OS에 속한 영역이 되어 자동으로 크기를 조절한다. 그에 따라서 더 큰 메모리 영역을 가지게 되어 OOM이슈가 줄어들었다, 패러럴 컬렉터가 기본사항이다. Generation Memory구조 Young : eden, survivor로 이루어져 있다 Tenured : virtual로 이루어져 있다..

Java 2022.05.24

JVM

JVM의 역할 컴파일된 자바클래스파일(자바바이트코드)를 읽어 운영체제에 맞게 프로그램으로 실행시키는 가상머신이다. 자바코드를 컴파일하면 기계어가 아닌 바이트코드로 변환되는데 이때 운영체제에서 바이트코드를 읽을수 있도록 해석해주는 역할이다. 가비지컬렉터를 이용해서 메모리 관리도 담당한다. Java7부터는 G1GC가 나와서 힙영역의 객체들을 관리하는 역할도 담당한다. OS에 종속적이다. 윈도우의 JVM과 리눅스의 JVM은 다르다 JVM의 구성요소 ClassLoader / ExecutionEngine / Memory(Runtime Data Area) / Native 크게 네가지로 나눠볼 수 있다. .class파일(바이트코드)를 불러와서 JVM메모리에 로드한다. 로딩된 클래스는 runtime data area에..

Java 2022.05.24

Spring Boot @Transactional

정의 스프링에서 어노테이션으로 선언적 트랜잭션 방식으로 트랜잭션을 처리하는것을 말한다. 사용 클래스, 인터페이스, 메소드에 사용할 수 있으면 메소드에 가장 가까운 어노테이션이 우선순위를 가진다. 어노테이션이 적용된 범위에서 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit, rollback을 진행해준다. 이 프록시 객체는 @Transactional이 포함된 메소드가 호출 될 경우 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고 commit, rollback을 진행해준다. 주의해야할점 - 적용범위 문제 상위메소드에서 하위메소드를 호출하는 경우, 하위메소드에서만 @Transactional을 선언하여 상위메소드에서 하위메소드시 호출시 @Transactional이..

spring 2022.05.24

Spring Boot사용시 Gradle Option구성요소

spring boot사용시 흔히 사용하는 gradle option에 대해서 살펴보고 알아봤다. 정의 gradle은 gradle을 위한 전용언어를 사용한다. groovy라는 언어를 기반으로 하는 DSL언어를 사용한다. DSL - Domain - Specific Languages : 도메인고유언어. 특정한 용도에 한정된 언어. 구성요소 build.gradle 빌드작업에 필요한 기본설정, 동작을 정의하고 의존성을 관리해주는 파일 plugins 해당 블록 안에 프로젝트 빌드에 필요한 플러그인을 작성하여 지정할 수 있다. 특정 플러그인을 추가하면 gradle task에 빌드 관련하여 수행할 수 있는 작업들이 추가된다. ( ex> java플러그인을 추가하면 compileJava task가 추가된다) build.gr..

spring 2022.04.14

객체지향 설계 5원칙 - SOLID원칙

SOLID원칙 객체지향의 5원칙 SOLID는 2000년대 초반 로버트C마틴이 제시하고 마이클페더스가 두문자어로 소개했다. SRP(Single Responsebility Principle) : 단일 책임 원칙 OCP(Open Closed Principle) : 개방 폐쇄 원칙 LSP(Liskov Subsitituation Principle) : 리스코프 치환 원칙 ISP(Interface Segregation Principle) : 인터페이스 분리 원칙 DIP(Dependency Inversion Principle) : 의존 역전 원칙 이 원칙들은 결국에 응집도를 높이고 결합도는 낮추라는 관점에서 재정립한것이다. 결합도 : 클래스(모듈)간의 상호의존정도를 나타내며 결합도가 낮으면 의존성의 줄어들어 객체의 ..

객체지향 2022.04.05