욱 연구소

슬기로운 개발생활

반응형

분류 전체보기 18

Chapter 03 역할, 책임, 협력

객체지향 패러다임의 관점에서 핵심은 역할(role), 책임(responsibility) 협력(collaboration)이다. (2장에서 다루었던 클래스, 상속, 지연 바인딩은 구현측면에서 중요하지만 본질과는 거리가 있다.) 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 객체지향 설계의 핵심은 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다. 01 협력 영화 예매 시스템 돌아보기 영화 예매라는 기능을 완성하기 위해 협력하는 객체들의 상호작용을 표현한 그림 객체지향 원칙을 따르는 애플리케이션의 제어 흐름은 다향한 객체들 사이에 균형 있게 분배되는 것이다. 다양한 객체들이 영화 예매라는 기능을 구현하기 위해 메시지를 주고받으면서 상호 작용한다. 협력 - 객체들..

Mac OS에서 Java(temurin JDK) 설치하기

temurin JDK가 뭐야? Oracle이 Java 소유권을 가지면서 Java 유료화에 대한 논란이 있었다. (Java 유료화에 대한 논란은 구글링 해보면 알수 있다.) 논란과 함께 Open JDK 사용률이 증가하게 되었고 그러면서 등장된 여러 배포버전(구현체)이 존재하게 되었다. (배급사별 배포버전으로 Azul Zulu, AdoptOpenJDK, Amazon Corretto 등이 흔히들 쓰이는 것 같다.) 필자는 위 배포버전에서 AdoptOpenJDK를 선택했다. (AdoptOpenJDK는 여러 기업의 후원을 받아 개발자들이 운영하는 커뮤니티로 추후에도 유료화가 되지 않고 사용할 수 있을 거 같았다.) 그리고 해당 AdoptOpenJDK는 Eclipse에서 Adoptium 프로젝트를 진행함에 따라 D..

[pyspark] 스파크 완벽 가이드 - 파케이(parquet)파일

데이터 소스 스파크는 여섯 가지 핵심 데이터 소스와 커뮤니티에서 만든 수백 가지 외부 데이터 소스가 있다. 핵심 데이터 소스 CSV JSON 파케이 ORC JDBC/ODBC 연결 일반 텍스트 파일 외부 데이터 소스 카산드라 HBase 몽고디비 AWS Redshift (Amazon Redshift는 클라우드에서 완벽하게 관리되는 페타바이트급 데이터 웨어하우스 서비스입니다.) XML 기타 수많은 데이터소스 이중에서도 가장 먼저 알아두어야 할것은 스파크의 기본 파일 포맷인 파케이(parquet)이다. 파케이 파일 파케이란 다양한 스토리지 최적화 기술을 제공하는 오픈소스로 만들어진 컬럼 기반의 데이터 저장 방식 파케이 특징 및 장점 분석 워크로드에 최적화 저장소 공간 절약 전체파일 대신 개별 컬럼을 읽을 수 있..

[pyspark] 스파크 완벽 가이드 - 다양한 데이터 타입 다루기

표현식을 만드는 방법과 다양한 데이터 타입을 다루는 방법 DataFrame을 먼저 하나 생성하자 df = spark.read.format("csv")\ .option("header", "true")\ .option("inferSchema", "true")\ .load("/data/retail-data/by-day/2010-12-01.csv") df.printSchema() df.show(5, False) df.createOrReplaceTempView("dfTable") 스파크 데이터 아비을 변환하기 위한 lit 함수 스파크 데이터 타입으로 변환하는 방법은 반드시 알아두어야 한다. 바로 lit 함수 from pyspark.sql.functions import lit df.select(lit(5), lit..

[pyspark] 스파크 완벽 가이드 - 구조적 API 기본 연산

기본 용어 개념 레코드(record) = row 컬럼(column) = 스프레드시트의 column과 유사 스키마(schema) = 컬럼과 데이터 타입 정의 파티셔닝(partitioning) = 물리적으로 배치되는 형태 파티셔닝 스키마 = 파티션을 배치하는 방법 정의 스키마 DataFrame의 컬럼명과 데이터 타입을 정의 데이터를 읽기 전에 스키마를 정의해야 하는지 여부는 상황에 따라 달라짐 스키마는 여러개의 StructField 타입 필드로 구성된 StructType 객체 df.printSchema() # 실행결과 # root # |-- DEST_COUNTRY_NAME: string (nullable = true) # |-- ORIGIN_COUNTRY_NAME: string (nullable = true..

[pyspark] 스파크 완벽 가이드 - 구조적 API 기본개념과 용어

구조적 API란? 비정형 로그 파일부터 반정형 CSV 파일, 매우 정형적인 파케이(Parquet) 파일까지 다양한 데이터를 처리할 수 있다. 배치(batch)와 스트리밍(streaming) 처리에서 구조적 API를 사용할 수 있음. 구조적 API의 세 가지 분산 컬렉션 API Dataset DataFrame SQL 테이블과 뷰 DataFrame과 Dataset 공통점 DataFrame과 Dataset은 잘 정의된 로우와 컬럼을 가지는 분산 테이블 형태의 컬렉션 결과를 생성하기 위해 어떤 데이터에 어떤 연산을 적용해야 하는지 정의하는 지연 연산의 실행 계획이며, 불변성을 가짐 차이점 DataFrame = 비타입형 데이터 타입이 존재하지 않는 것은 아님 스키마에 명시된 데이터 타입의 일치 여부를 런타임에 확..

VO와 DTO 는 다르게 부르는 같은 말?

VO vs. DTO DTO와 VO는 분명히 다른 개념과 목적을 가지고 사용하는 객체 이지만 그것에 대한 구분 없이 혼동하여 사용하는 경우가 많다. 그의 원인으로는 일반적으로 ⌜Core J2EE Patterns: Best Practices and Design Strategies⌟ 책의 초판에서 데이터 전송용 객체를 VO로 표기를 했었고 2판에서는 해당 객체를 TO로 정정하여 표기를 하였다고 한다. 이로인하여 DTO와 VO를 혼동하게 된 것으로 보고 있다. 개인적으론 실질적으로 개발자들간에 협업이나 커뮤니케이션을 할때 단편적인 개념으로 이야기를 하다보니 각각 다르게 이해를 하고 있어 더욱이 혼동하고 혼용하여 사용하게 된 것 같다. 개념 정리하기 DTO(Data Transfer Object) 순수하게 값을 ..

오브젝트:코드로 이해하는 객체지향 설계 Ch.02

01 (온라인) 영화 예매 시스템 요구사항 영화: 영화에 대한 기본 정보를 표현 (제목, 상영시간, 가격 정보) 상영: 실제로 관객들이 영화를 관람하는 사건 (상영 일자, 시간, 순번 등) 두 용어의 차이의 중요성 사용자가 실제로 예매하는 대상은 영화가 아니라 상영 사람들은 영화를 예매한다고 표현하지만 실제로 특정 시간에 상영되는 영화를 관람할 수 있는 권리를 구매하기 위해 돈을 지불하는 것 특정한 조건을 만족하는 예매자는 요금을 할인받을 수 있음 할인액을 결정하는 두 가지 규칙 할인 조건(discount condition): 가격의 할인 여부를 결정하며 ‘순서 조건’과 ‘기간조건’ 두 종류로 나눌 수 있다. 순서 조건(sequence condition): 상영 순번을 이용해 할인 여부를 결정하는 규칙 ..

오브젝트:코드로 이해하는 객체지향 설계 Ch.01

Chapter 01 객체, 설계 소프트웨어 유지보수에 대해 중요도가 낮음 소프트웨어 모듈이 가져야 하는 세가지 기능(로버트 마틴) 실행 중에 제대로 동작하는 것 변경을 위해 존재하는 것 코드를 읽는 사람과 의사소통하는 것 변경에 취약한 코드 의존성(dependency): 어떤 객체가 변경될 때, 그 객체에 의존하는 객체도 변경될 수 있음 결합도(coupling)가 높은 코드 결합도가 높다: 의존성이 강하다 결합도가 낮다: 합리적인 수준으로 의존한다 객체지향 설계의 목표: 객체 사이의 결합도를 낮춰 변경이 용이한 설계는 만드는 것 변경에 유연한 코드 자율성을 높이자 캡슐화(encapsulation) 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것을 캡슐화 내부로의 접근을 제한하면 -> 객체와 ..

Constant Interface

상수를 인터페이스로 사용하는 것은 Anti pattern이다. 인터페이스가 아닌 Final Class를 써야 한다. 상수 변수 사용시 import를 static으로 선언하면 클래스명을 생략하여 사용할 수 있다. /** * 클래스로 구현한 공통코드 상수 */ public final class CommonCode { private CommonCode() { throw new AssertionFailure(); } public static final String ERROR_CODE_A = "001"; public static final String ERROR_CODE_B = "002"; } import CommonCode ; /** * 공통코드 상수 클래스를 호출하는 방법1 */ public class Res..

반응형