import random from PIL import Image, ImageDraw, ImageFont
# 수식 생성 함수 def generate_equation(): operand_count = random.randint(2, 3) # 항의 개수 (2-3) equation = "" # 랜덤하게 숫자와 연산자를 조합하여 수식 생성 for i in range(operand_count): if i > 0: operator = random.choice(["+", "-"]) # 연산자 선택 (+, -) equation += operator equation += str(random.randint(1, 9)) # 숫자 선택 # 곱하기 연산자 추가 (최대 1번) if random.random() < 0.5: # 50%의 확률로 곱하기 연산자 추가 equation += "X" + str(random.randint(1, 9))
# 이미지 크기 설정 image_width = 600 image_height = 100 # 이미지 저장 디렉토리 save_directory = "C:/app/math/" # 폰트 설정 font_path = "C:/Windows/Fonts/Arial.ttf" font_size = 40 font = ImageFont.truetype(font_path, font_size)
# 500개의 수식 이미지 생성 및 저장 for i in range(500): equation, answer = generate_equation()
# 이미지 생성 image = Image.new("RGB", (image_width, image_height), (255, 255, 255)) draw = ImageDraw.Draw(image)
# 3세대 포켓몬 데이터 추출 table_3rd_gen = tables[8] for row in table_3rd_gen.find_all('tr', style=lambda style: style and 'background:#FFF' in style): cells = row.find_all('td') if len(cells) >= 4: number = cells[0].text.strip() english_name = cells[2].find('a').text.strip() image_cell = cells[1] image_url = image_cell.find('img')['src'] if image_cell.find('img') else None if image_url and number: # 이미지 URL에 스키마를 추가합니다. image_url = urljoin(url, image_url) # 이미지 URL에서 "70px" 부분을 "500px"로 변경합니다. image_url = image_url.replace("70px", "500px")
# 번호 포맷 변경: #0252 -> (No.252) number = re.sub(r'#0*(\d+)', r'(No.\1)', number)
# 포켓몬 이름을 한글로 번역 korean_name = translation_data.get(english_name, english_name)
DDD는 복잡한 도메인을 이해하고 구성하는 데에 초점을 맞춘 소프트웨어 개발 방법론입니다.
이는 애플리케이션을 여러 개의 레이어로 나누어 도메인 모델을 중심으로 설계하는 것을 강조합니다.
이러한 레이어는 각각의 책임과 역할을 가지며, 각각의 레이어는 독립적으로 변경될 수 있습니다.
Spring Boot는 Spring Framework의 간소화된 버전으로, Java 애플리케이션을 쉽게 구축할 수 있도록 도와줍니다.
Spring Boot는 설정의 자동화, 내장된 서버, 스프링 기반 애플리케이션의 개발과 배포를 간편하게 만들어줍니다.
Spring Boot와 DDD를 함께 사용할 때, 전통적인 Spring 기반의 계층 구조 대신 DDD의 개념을 반영한 구조를 적용할 수 있습니다.
일반적으로 다음과 같은 구성 요소로 구성됩니다.
도메인 모델(Domain Model): DDD에서 도메인 모델은 애플리케이션의 핵심이 되는 비즈니스 도메인을 나타내는 객체입니다. 도메인 모델은 도메인의 개념과 규칙을 캡슐화하고, 비즈니스 로직을 처리하는 책임을 갖습니다. Spring Boot에서는 도메인 모델을 일반적인 Java 클래스로 표현할 수 있습니다.
리포지토리(Repository): 리포지토리는 도메인 객체를 영구 저장소에 저장하고 검색하기 위한 인터페이스입니다. Spring Boot에서는 리포지토리를 인터페이스로 정의하고, Spring Data JPA 등의 기술을 사용하여 데이터베이스와의 상호작용을 구현할 수 있습니다.
애플리케이션 서비스(Application Service): 애플리케이션 서비스는 도메인 모델 사이의 상호작용을 조정하고, 도메인 객체의 상태 변경을 처리합니다. Spring Boot에서는 애플리케이션 서비스를 일반적인 Spring Bean으로 구현할 수 있습니다.
인프라스트럭처(Infrastructure): 인프라스트럭처는 데이터베이스, 외부 서비스, 메시징 시스템 등과의 상호작용을 담당합니다. Spring Boot에서는 데이터베이스 연결, 메시지 브로커 설정 등을 위해 Spring의 기능을 사용할 수 있습니다.
DDD 주요 레퍼런스
Amazon: Amazon은 대규모 분산 시스템 및 마이크로서비스 아키텍처를 구축하는데 Spring Boot와 DDD 구조를 활용하고 있습니다. Amazon의 여러 서비스와 플랫폼 중에서도 AWS(Amazon Web Services)는 Spring Boot와 DDD를 사용하여 개발되었습니다.
Netflix: Netflix는 Spring Boot와 DDD 구조를 사용하여 대규모 온디맨드 비디오 스트리밍 플랫폼을 개발하고 운영합니다. Netflix의 다양한 마이크로서비스는 도메인 모델과 DDD의 원칙에 따라 설계되었으며, Spring Boot를 통해 개발 및 배포되고 있습니다.
Microsoft: Microsoft는 Spring Boot와 DDD 구조를 사용하여 클라우드 서비스, 기업 애플리케이션, 인프라스트럭처 관리 도구 등 다양한 솔루션을 개발하고 있습니다. Azure를 통해 Spring Boot와 DDD를 사용하여 개발된 애플리케이션을 구축할 수 있습니다.
현대자동차그룹: 현대자동차그룹은 Spring Boot와 DDD 구조를 활용하여 자동차 관련 애플리케이션과 서비스를 개발하는데 사용하고 있습니다. 현대자동차그룹은 DDD의 주요 원칙을 적용하면서 도메인 모델을 중심으로 한 애플리케이션 아키텍처를 구축하고 있습니다.
자바 컴파일러는 CLASS파일을 생성하고 이 파일의 바이트코드를 읽은 뒤 자바 가상머신에서 기계어로 바꾸어 실행하기 때문에 윈도우, 리눅스, 맥OS등OS에 구분없이 잘 작동합니다.
요즘 개발언어로 각광받고 있는 Python, Ruby를 순수 객체지향이라 부르는데, JAVA는 모든 것을 객체로 보는 언어는 아니다. *원시타입(Primitive)은 객체로 보지 않음
객체 지향 프로그래밍을 잠깐 설명하자면, 작은 문제들을 해결할 수 있는 객체들을 만든 후 객체들을 조합해서 큰 문제를 해결하는 상향식 해결법을 도입해서 만든 것으로 이런 객체들은 만들어 놓기만 하면재사용이 가능하다는 장점이 있다.
객체 지향 프로그래밍 언어는 요소로는캡슐화 (변수와 함수를 하나의 단위로 묶는 것), 상속(자식 클래스는 부모 클래스의 특성 & 기능을 물려받아서 사용한다는 것, 캡슐화를 유지하면서 클래스 재사용이 용이하게 해준다.), 다형성(서브타입, 매개변수, 임시, 강제)등이 있다.
다형성 부분은 서적을 통해서 읽어보시면 개발하실 때 반드시 도움이 되실 것입니다.
웹 애플리케이션 제작을 위해서 사용하는 규격은JAVA 서블릿과 JSP(Java 서버 페이지)가 있다. 닷넷으로 치면 서블릿이 .cs(로직), jsp가 .aspx페이지(화면)
JDK(Java Development Kit)로 설치를 하면 javac라는 컴파일러를 제공하지만 따로 개발환경을 해주지 않기 때문에!
이클립스, Intellij와 같은 프로그램을 설치해서 사용해야 한다.
프로젝트에 필요한 라이브러리나 빌드 관리 도구는maven, gradle이 많이 채용된다.
오라클에서 제공하는 버전은 요즘 유료화 되어, 기업에서 사용 시OpenJDK를 사용하는 것이 일반적인 추세이다.
JAVA에서 사용하는 웹 프레임워크는 대표적으로스트럿츠(STRUTS), 스프링(Spring)가 있다.
JAVA로 웹 서버를 개발하면 대부분 Spring에서 만든다고 생각하시면 되는데, 구조는 아래와 같습니다.
Spirng의 특징은 아래와 같습니다.
Spring은 자바 객체와 라이브러리들을 관리해주며, 톰캣과 같은 WAS 가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있습니다.
Spring은 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리합니다. 객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용합니다.
제어의 역전(IOC , Inversion Of Control) : 클래스 내부의 객체 생성 -> 의존성 객체의 메소드 호출이 아닌,스프링에게 제어를 위임하여 스프링이 만든 객체를 주입 -> 의존성 객체의 메소드 호출 구조입니다. 스프링에서는 모든 의존성 객체를 스프링이 실행될때 만들어주고 필요한 곳에 주입해줍니다.
의존성 주입(DI, Dependency Injection) : 어떤 객체(B)를 사용하는 주체(A)가 객체(B)를 직접 생성하는게 아니라객체를 외부(Spring)에서 생성해서 사용하려는 주체 객체(A)에 주입시켜주는 방식입니다. 사용하는 주체(A)가 사용하려는 객체(B)를 직접 생성하는 경우 의존성(변경사항이 있는 경우 서로에게 영향을 많이 준다)이 높아집니다. 하지만, 외부(Spring)에서 직접 생성하여 관리하는 경우에는 A와 B의 의존성이 줄어듭니다.
Spring Boot는 Spring Framework 기반 프로젝트를 쉽고 빠르게 만들어주는 라이브러리라고 생각하시면 편합니다. (스프링 프레임워크를 보다 쉽게 셋팅할 수 있게 해줌)
Spring Framework로 셋팅할려면 기존에는 개발자가 모든 것을 셋팅해야 했는데, (ibatis, mybatis, dbcp, logback, log4j, maven, gradle, mvc servlet, mvc interceptor, spring security등등)
이런 복잡한 설정을 대부분 미리 셋팅해 놓아 바로 웹 개발에 들어갈 수 있도록 했다.
SPRING BOOT가 나오기 전에는 프로젝트를 진행할 때 기존 프로젝트 사용설정을 복붙하고 필요한 것은 다시 셋팅해주는 번거로움이 있었는데 이를 대체한 것이다.
Spring Boot는 이외에도 많은 장점이 있는데, Spring 라이브러리와 third party 라이브러리 버전을 자동으로 관리해주는 기능이라던지, tomcat을 내장하고 있으며, war가 아닌 jar로 패키징이 가능하고, starter 라이브러리를 등록하여 의존성을 간단히 관리할 수 있다.