-
java 병렬로 연산하기 ExecutorService API 쓰레드풀에 일정 개수의 쓰레드를 만들어두고 처리하는 방식의 API : limit 개수만큼 동시에 처리함 ExecutorService executor = Executors.newFixedThreadPool(5); List<Future<String>> results = new ArrayList<>(); for (int i = 0; i < 30; i++) { results.add(executor.submit() -> { Thread.sleep(5000); return Thread.getCurrrentName() + ", end time : " + LocalDateTime.now(); }); } for (Future<String> result : results) { System.out.println(result.get()); } executor.shutdown(); Stream API(java8) 하나의 task를 여러개 task로 쪼개고, 처리한 후 하나로 합치는 형태로 처리...
-
스테이트 패턴 객체의 상태가 변경됨에 따라 다르게 행동할 수 있음 : 상태 자체를 객체화하는 것이라고 이해됨 - 상태를 추상화 시킴, 상태에 따라 할 수 있는 일이 많아지고 조건문이 엄청 세분화 되어질 때 분리시켜서 관리하도록 하는 것이 좋을 듯 상태 별로 같은 행동(코드 중복 제거), 상태 별로 코드 관리(코드 관리에 편함) 볼링 게임 구현할 때 사용했던 패턴이었음 : 상태 자체가 실질적으로 쓰러뜨린 핀(입력된 값)이 유효한 값인지 아닌지 해당 프레임의 상태값이 무엇인지 정할 수 있었음 예제로 되새겨보는...
-
sync/async, blocking/non-blocking Java9도, Spring5도, nodejs도 얘기할 때 가장 큰 토픽이 async/non-blocking이라고 하던데 정확히 구분을 할 수 없어 공부해야겠다는 생각이 들었음 헷갈리는 부분 두 그룹의 구분해서 이해하기 blocking/non-blocking : 시스템 콜에 대한 결과 반환 전까지 대기(wait), 처리가 완료되지않아도 결과가 반환되어 제어권이 넘어와서 다음 처리를 할 수 있음 sync/async : 호출하는 쪽에서 작업 완료 여부를 신경씀(완료 확인을 계속함)과 작업 완료 여부 신경쓰지않고 호출한 함수에 맡겨버림(완료 처리는 콜백함수로 호출받은 쪽에서 완료 후 처리함) 참고자료 HomoEfficio - Blocking-NonBlocking-Synchronous-Asynchronous nesoy...
-
Java API ArrayList vs LinkedList 많이 쓰는 자료구조지만, 개념적으로 차이도 이해하고 있지만 익숙하다고해서 ArrayList만 사용하지않나? 제대로 사용하기위해서 코드를 눈으로 봐야겠다싶었음 개념적 차이 ArrayList는 배열로, LinkedList는 객체 간 연결을 통해 리스트를 만듦 ArrayList는 탐색에 유리 : 인덱스 LinkedList는 제일 앞, 뒤 확장에 유리 : 삽입이 빈번할 때 유리 API 코드 확인 LinkedList /* head와 tail을 알고 있음 */ transient Node<E> first; transient Node<E> last; /* 꼬리에 붙임 */ public boolean add(E e) { linkLast(e); return true;...
-
데이터 캐시하기(2) - 스프링 캐시 추상화, redis 글로벌 캐시 스프링 캐시 추상화 - AOP, 캐시 매니져 AOP : @Cacheable, @CacheEvict 캐시 관련 코드를 비즈니스 로직에서 덜어낼 수 있도록 어노테이션(포인트컷)을 설정해두면 프록시? CGLib? 어찌되었건 캐시 동작(read, write) @Cacheable : 캐시 서비스를 메소드 단위로 설정 어노테이션 name : 캐시 이름 메소드 파라미터(key), 리턴 데이터(value) : 파라미터가 없을 경우 기본 키 값을 생성, 파라미터가 여러개인 경우 key=”#파라미터명” 으로 설정, 객체일 경우 key=”#객체.필드명” (SpEL) @Cacheable("item") public Item findByName(String name)...
-
정리해보기 객체지향 객체지향 : 분업화, 하나의 세상을 이루기위해서 하나의 존재만이 있는 것이 아니라 여러 존재들이 협업하면서 세상을 이룸, 협업이 필요하다면 필요한 객체가 다른 객체에 메세지를 보내 요청함, 파일로 코드를 분리한 것과는 전혀 다른 개념임(저장 공간만 달리할 뿐 하나로 처리하는건 마찬가지) 객체지향의 장점 : 역할 별로 객체를 나누다보니 어떤 한 기능을 수정할 때 담당 객체의 코드만 수정해주면 됨 - 변경점이 하나로 모임, 변경사항이 생기더라도 유연하게 대처할 수 있음(코드 간의 의존성이 적기때문에 - 물론 객체지향적인 프로그래밍을 했다면),...
-
java-ims 객체지향적으로 프로그래밍하기 상태값을 꺼내어 외부에서 작업하지말고, 메세지로 요청을 날리자 path를 ControllerPool에 전달해서 ControllerPool이 원하는대로 작업을 하는게 아니라 path를 가진 Request에 요청할 수 있게 Request 객체만 전달해서 요청할 수 있게하기 매번 의식하는데 이런 사소한 부분에서 계속해서 객체지향적인 코딩을 하지못하네…. 계속 의식하면서 하기 /* 수정 전 */ public class ControllerPool<T extends Controller> { . . . public T search(String requestPath) { . . . } } /* 수정 후 */ public class ControllerPool<T extends Controller> {...
-
JPA 연관관계 맵핑 - 객체지향과 데이터베이스의 패러다임 불일치 인식하기 객체의 관계는 단방향이지만, 데이터베이스의 테이블은 fk 하나로 양방향 관계를 맺을 수 있음 반대쪽에 객체 참조 필드를 생성하기 전까지 단방향 관계임 : 테이블은 SQL FK로 JOIN을 사용하면 둘다 조회가능하지만 객체는 .get()과 같은 메소드를 사용해야하는데 참조 필드가 없으면 할 수가 없음(패러다임의 불일치) - .get()을 해야 내부적으로 SQL을 생성할텐데 없으면 그렇지도 못함(이 부분은 없애고 올리기) /****** 단방향 ******/ public class Member { private Long id; private Team team; }...
-
java-ims response 생성하기 request 정보와 controller 처리 결과를 가지고 response(outputstream)처리를 하는 객체 RequestHandler에서 response.response() 했을 때 비로소 outputstream 실행 : 연결된 클라이언트에 데이터(HTTP 응답메세지)를 보냄 public class Response { private HttpStatus status; private HttpHeader header; private HttpBody body; private DataOutputStream out; public Response(OutputStream out) { this.out = new DataOutputStream(out); header = new HttpHeader(); } public Response setStatus(HttpStatus status) { this.status = status; return this; } public Response setHeader(ResponseHeaderAttribute attribute, String value) { header.add(attribute.name(), value); return...
-
java-ims 내부 flow Request 메세지 파싱 Request 객체 생성 Request에 핸들러(컨트롤러) 요청 : path를 가지고 있기때문에 위임 컨트롤러에 Request 넘겨주며 처리 요청 ResponseEntity(HttpMethod, Header, Body) 생성 Response 객체 응답하기 Response 작성할 때 필요한 데이터를 가진 ResponseEntity 만들기 빌더 패턴으로 만들기 장점 : 조립하듯이 객체를 생성할 수 있음, 객체 생성 시 설정해야할 필드가 많아지면서 선택적으로 필드를 설정할 수 있게할 때 좋음(유연성), 특정 필드만 깔끔하게 기본값을 설정해둘 수 있음, 필드 각각의 할당 조건이 생길 때 분리해두면 코드가...
-
java-was RequestLine/Headers/Body 생성자에서 처리하는 작업을 유틸리티 클래스를 만들기 보기좋은 코드를 만들기위해서 인자를 처리하는 작업만을 하는 클래스를 따로 만들기 상태값을 가지지않고 메소드 인자로 처리 대상을 받아 처리하기 : static 메소드 public class RequestUtils { public static List<String> splitRequestLine(String requestLine) { return Arrays.asList(requestLine.split(" ")); } public static List<String> splitPathAndParams(String pathAndParams) { return Arrays.asList(pathAndParams.split("\\?")); } public static Map<String, String> splitQueryString(String queryString) { return splitValues(queryString, "&"); } private static Map<String, String> splitValues(String target, String regex) { if (Strings.isNullOrEmpty(target)) {...
-
java-was 기존 코드 분석하기 서버 소켓(8080 - 웹서버가 80을 사용하고, WAS는 8080 리버스 프록시)을 만들어두고 클라이언트 소켓의 연결 요청을 기다림 클라이언트 소켓이 연결되면 클라이언트의 요청을 처리할 핸들러(쓰레드)를 실행시킴 : 클라이언트 연결 Request 만들기 Request 담당 오브젝트 테스트하면서 만들기 Request 생성자 설계 : InputStream을 인자로 받음 매번 브라우저로 요청을 보내고 HTTP 메세지를 읽지않기위해 모의 HTTP 메세지로 내용이 구성된 파일(request.txt)로도 읽을 수 있게) request.txt 읽기 gradle, maven은 정해진 디렉토리에 정해진 파일을 넣어야함 : resource를 class path에 넣어두고...
-
java-ims 다운로드 기능 만들기 업로드 했던 파일을 반대로 다운로드 하는 기능을 만들어야함 특정 이슈에 특정 유저가 올린 특정 파일을 다운로드 업로드 했을 때 AttachmentRepository에 업로드 정보를 저장함 : 이슈 id, 사용자 id, 첨부파일 uuid(식별자 - 런타임 시에 고정된 전략이라서 static 메소드를 사용했지만 AttachmentNameConverter도 런타임 시에 다양한 전략을 사용하게끔 한다면 DI로 변경해도됨)와 origin name 등 public class AttachmentService { public Issue upload(User loginUser, Issue issue, MultipartFile file) throws IOException { String savedFileName = fileSaver.save(file, AttachmentNameConverter.convertName(file.getOriginalFileName())); Attachment...
-
스프링부트 HTTP 세션 데이터 쉽게 가져오기 - 커스텀 파라미터 만들기 HandleMethodArgumentResolver를 사용함 파라미터를 커스텀하는 역할, 두개의 메소드를 오버라이드 한 후 스프링 MVC에 리졸버를 등록하고, 실제로 적용할 부분에 선언해서 사용함 Interceptor와 컨트롤러 로직 사이에 존재하는 것으로 생각 : 코드 중복을 줄일 수 있음(같은 파라미터를 가지고 기능 구현을 한다면) 어노테이션 생성하기 : 커스텀 파라미터로 사용할 파라미터라는 표시(설정) @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface LoginUser { public boolean required() default true; } 커스텀 파라미터 만들기 - HandleMethodArgumentResolver public class LoginUserHandlerMethodArgumentResolver...
-
스프링부트 알고 개발하기 (JPA) 자바를 사용해서 데이터를 유지하는 기술(그 중 ORM)의 표준 스펙 : 인터페이스 ORM : 객체 - 테이블 레코드를 맵핑해서, 로직 처리와 데이터베이스 데이터 관리 한방에 할 수 있음, 객체지향적으로 개발할 수 있음 테이블 주도 개발이 아닌 객체 주도 개발을 할 수 있음 : 비즈니스 로직에 더 신경쓰고 개발할 수 있음 단점 : 쿼리를 직접 만들지않고, 메소드로 다루기때문에 성능 튜닝이 어려움, 쿼리를 직접 만들어서 실행시킬 수도 있지만 쿼리에 얽메이는 개발을 하게되므로 ORM 장점을...
-
자바 어노테이션 java 1.5부터 추가된 기능 소스코드에 메타코드(추가적인 정보)를 붙이는 것 추가적인 정보에 따라 기존의 실행과 다르게 실행될 수 있음 컴파일, 런타임 모두 활용 가능 컴파일 타임에 메타 데이터가 적용된 코드에 코드를 추가할 수도 있고, 런타임 때 메타데이터에 의해 실행 흐름이 바뀔 수도 있음 런타임에는 리플렉션을 활용해서 어노테이션이 적용되어있는지 체크할 수 있음 @Override public String toString() { } 사용자 정의 가능함 : 정의 -> 사용 -> 실행 Annotation 파일 만들기 Annotation 적용되었는지 리플렉션으로 확인 /*...
-
코드스쿼드 레벨2 과정이 거의 끝나가고 있다. 레벨2의 목표는 객체지향프로그래밍 익히기이다. 그동안 5가지의 미션을 하면서 책을 통해서만 공부하던 객체지향을 직접 느껴보았다. 과정 중에 와닿았던 것, 그리고 객체지향프로그래밍을 한다면 반드시 그래야만 하는 것, 기억해야할 것들을 이 글을 쓰면서 정리해보았다. 글에 쓰일 예제 코드들은 모두 5번째 미션이었던 볼링 프로그램 코드 중 일부(직접 짠 코드보다 다 짜고난 뒤 비교해본 마스터의 코드이다 - 코드 비교 리뷰를 하면서 느낀점이 굉장히 많아 마스터의 코드를 바탕으로 글을 써보았다) 이다. 볼링 프로그램을 택한 이유는...
-
enum 상수값을 모아서 관리하기 문자열이었다면 많은 예외처리를 해야할 수 있지만, 값의 범위를 강제해버리기떄문에 안전한 프로그래밍이 가능함 예를 들어 0 ~ 6까지 전달받아야하는데 래핑시켜서 그 값들만 받게끔 할 수 있음 : 유효성 체크 메소드 따로 만들지않고도 예시 2 : 방향 4가지만 줄 수 있도록 강제 /* example */ public enum Direction { NORTH, SOUTH, EAST, WEST; } public class Ladder { public void move(Direction direction) { } } 클래스의 인스턴스 개수를 제한해버리고 만듦 : static 환경에서...
-
객체 간의 관계 자바는 객체지향 언어 객체지향언어는 객체 간의 협력이라는 관점 아래 프로그래밍 서로 관계를 맺는데 그 중 중요한 상속 관계와 인터페이스 구현 관계에 대해 공부한 내용을 정리하였음 자바 객체지향의 상속과 인터페이스 자바는 객체지향 상속을 extends로 구현했음 확장(extends) 의미 구체화(특수화) 의미 : is a kind of 분류도를 만들어나감 자바는 다중 상속 안되게 막아놓음 : 지원한다면 개발자가 고려해야할게 많아짐 - 필드, 메소드명 중복되었을 때 객체의 인터페이스로 능력 확장이 가능함 : is able to 다중 상속은 못하지만...
-
TDD 시작하기 테스트 주도 개발! 요구사항, 결과 출력 화면만 보고 필요 객체, 설계를 예상하면서 만드는 궁예가 되지말자 기능 상 아주 작은 부분으로 쪼개서 실패 테스트 케이스를 작성하고 성공 케이스로 만들기위해 설계, 코드 리팩토링을 하자 한꺼번에 설계를 해두고 개발하는게 아니라 작은 기능부터 설계하고 개발하면서 설계를 리팩토링 하는 방식으로 개발하자는 것! TDD로 개발해보기 코드스쿼드 프로그래밍 미션을 일부 가져와서 TDD 예시를 들어보려한다. 로또 프로그램 진행 화면 : 당첨번호 6개를 입력받아 로또 인스턴스를 생성해야하는 과정이다. 지난 주 당첨 번호를...
-
상속은 inheritance가 아니라 확장(extend) public class Car { } public class Sonata extends Car { } 상속을 한다는 것은 타입을 세분화(하위 타입 생성)시키겠다는 것 하위클래스는 상위타입의 한 종류이다 : is a kind of 하위클래스와 상위클래스의 관계 상-하위 관계를 설계해두면? 중복 코드를 줄이면서도, 다형성을 적극 활용할 수 있음 추상클래스(abstract class) public abstract class Car implements Movable { public abstract void method(); } public class Sonata extends Car { @Override public void method() { } } 자바에서는...
-
시작하기 코드스쿼드에 들어와서 프로그래밍을 하고 피드백 받는 과정에서 그동안 어렴풋한 개념으로 알고 있었던 것들을 확실하게 알게됨 그 내용들을 두고두고 참고하기위해서 정리를 시작함 많은 내용이 있지만 먼저 정리한 것부터 조금씩 조금씩 글을 쓸 예정 객체 간의 요청 - 응답으로 프로그램이 완성시키기 // CoordinateMain.java List<Point> points = Input.getPoints("좌표를 입력해주세요."); Figure triangle = new Triangle(points); Viewer.viewAtCoordinate(triangle); 객체에 역할을 할당했다면, 역할에 해당하는 일을 싸그리 맡기기 역할을 맡은 객체가 어떻게 처리하는지는 중요하지않고, 응답 결과만 얻어오면됨 보기 좋은 코드 만들기 for...