분류 전체보기 (229) 썸네일형 리스트형 PDD(페이지 주도 개발)는 나쁘다 JSP처럼 페이지단위로 개발이 진행될 경우 거의 모든 데이터는 페이지 상의 어딘가에 표현이되거 나 표현을 위한 조건으로 사용된다 페이지는 독재자다. 데이터는 페이지의 필요에 따라 선택당하며, 강하게 종속된다. 이는 변경에 매우 취약한 구조이다. 물론 이게 꼭 나쁜건만은 아니다. 관리자페이지와 같은 간단한 게시판형태의 화면이라면 더할 나 위없이 좋은 선택이라 생각한다(물론 게시판이 다같은 게시판은 아니지만). 다시 본론으로 돌아와서, 특히 백엔드 아키텍처를 페이지단위로 구성한다면 다음과 같다. PageAController - PageAService ... PageBController - PageBService 데이터는 도메인(모델)의 구조를 가지지 못하며, 그저 데이터쪼가리일 뿐이다. 나는 그런 페이지와 .. 2022년 한해를 돌아보며.. 1 2022년 한해를 돌아보며.. 2 3 오늘로 벌써 입사 2년 5개월 4 하루면 올해도 끝이다. 6 올해는 상당히 뜻깊은 해였다. 7 1. 어렴풋하게나마 이해했던 객체지향을 절차지향적인 회사코드를 리팩터링해보며 DIP에 대해 한층 더 와닿는 느낌을 받을 있었다. 8 객체지향의 핵심키워드로 늘 언급되던 의존성 역전 원칙은 객체지향 설계를 시작할 때 떠올리기엔 다소 난감한 주제이다. 9 객체지향의 핵심은 개별 객체의 역할과 책임이며 올바르게 타 객체와 상호작용을 했을 때 비로소 DIP에 대해 더 잘 생각이 날 수 있었다. 10 11 2. 진로에 대해 확실하게 정할 수 있었다. 12 개인적으로 프론트/백 엔드 나뉘기 이전에 레거시가 있다고 생각한다. 그리고 이 레거시는 프/백 구분이 없다. 그리고 나는 그런.. 어댑터 패턴 어댑터는 '제공되고 있는 것'과 '필요한 것' 사이를 연결해주는 역할을 한다. 예제) Banner 클래스를 사용해서 Print 인터페이스를 충족시키는 클래스를 만든다. PrintBanner 클래스: 어댑터 역할 제공되어 있는 Banner 클래스를 상속해서, 필요로 하는 Print 인터페이스를 구현한다. package adapter; public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } public void showWithAster() { System.ou.. dto 복사에 관하여 일하다가 dto 복사할일이 생겨서 방법을 두가지 생각해봤다. 예제는 dto의 데이터 일부를 추출하여 toString으로 콘솔에 찍어보기다. package dto.test; public class DtoCopyTest { public static void main(String[] args) { MyDto dto = new MyDto(); dto.setId("20221208"); dto.setName("dev-jones"); dto.setBirthday("19900101"); MyDtoCopy dtoCopy = new MyDtoCopy(dto); System.out.println(dtoCopy.toString()); } } class MyDto { private String id; private String.. 2년차 개발자의 읽은 책 후기 및 지난날을 돌아보며.. 이번주면 어느덧 입사한지 만2년차가 된다. 물론 여전히 잘모르고 헤매는 한마리의 어린양이지만 지난날들을 읽은책들을 중심으로 정리하려한다 1. 최범균 - DDD start 2 -> 새로운(?) 아키텍처를 접하면서, 기존에 내가 관리하고 있는 애플리케이션의 아키텍처를 조금더 객관적으로 돌아볼수 있었음. -> 얄팍하게나마 설명할 수 없는, 개선할 수 없는 우리네 업무코드가 무엇이 문제인지 의심하고 어떻게 해결해야할지 설계관점에서 고민하면서 읽음. 2. 조영호 - 오브젝트 나름대로 오랫동안 고민한 객체지향이라는 주제를 우리네 업무로직이 정말로 객체지향설계인가? 아니라면 어떻게 도입할 것인가? 궁금해하며 읽음. 위 ddd 아키텍처의 도메인 서비스에 해당하는 주제라는 것을 알게됨. 이전에는 객체지향이란게 혼란스러운.. [스레드] 12. 스레드풀(3) - 리턴값이 있는 작업 완료 통보 package ex09_execute_submit; import java.util.concurrent.*; public class ResultByCallableExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool( Runtime.getRuntime().availableProcessors() // cpu의 코어수 ); System.out.println("[작업 처리 요청]"); Callable task = new Callable() { @Override public Integer call() throws Exception {.. [스레드] 11. 스레드풀(2) 예제1) package ex09_execute_submit; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class ExecuteVsSubmitExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); for (int i = 0; i < 10; i++) { Runnable runnable = new Runnable() { @Override public v.. [스레드] 10. 스레드풀(1) ExecutorService 스레드 폭증 - 병렬 작업 처리가 많아지면 스레드의 개수가 증가 - 스레드 생성과 스케쥴링으로 인해 cpu가 바빠지고, 메모리 사용량이 늘어난다. - 따라서 애플리케이션 성능 급격히 저하됨. 스레드 풀(Thread pool) - 작업 처리에 사용되는 스레드를 제한된 개수만큼 미리 생성 - 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리 - 작업 처리가 끝난 스레드는 작업 결과를 애플리케이션으로 전달 - 스레드는 다시 작업큐에서 새로운 작업을 가져와 처리 ExecutorService 인터페이스와 Executors 클래스 - 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent 패키지에서 제공 - Executors의 정적 메소드를 이용해서 ExecutorService.. [스레드] 9. 스레드 그룹 스레드 그룹 - 관련된 스레드를 묶어서 관리할 목적으로 이용 - 스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수 있다. - 자동 생성되는 스레드 그룹 * system 그룹: JVM 운영에 필요한 스레드들을 포함 * system/main 그룹: 메인 스레드를 포함 - 스레드는 반드시 하나의 스레드 그룹에 포함 * 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다. * 명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 system/main 그룹에 속한다. 스레드 그룹 이름 얻기 ThreadGroup group = Thread.currentThread.getThreadGroup(); Stirng gruopName = group.getName(); 예제) package ex08_thre.. [스레드] 8. 데몬 스레드 데몬(daemon) 스레드 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료 ex) 워드프로세서의 자동저장, 미디어플레이어의 동영상 및 음악 재생, 가비지 컬렉터 데몬 스레드 설정 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출 public static void main(String[] args) { AutoSaveThread thread = new AutoSaveThread(); thread.setDaemon(true); thread.start(); } -> 반드시 start() 메소드 호출전에 setDaemon(true) 호출필 데몬스레드확인 방법 isDaemon() 예제) 메인메소드 종료시 데몬스레드도 종료되는지 확.. 이전 1 2 3 4 5 ··· 23 다음