-
절차지향 vs 객체지향 프로그래밍 입사 첫날 운 좋게도 객체지향의 사실과 오해 저자이자 배민찬 개발자이신 조영호님의 특강을 들을 수 있었다. 절차지향과 객체지향적인 설계와 코드를 비교해가며 각각의 특징과 장단점에 대해 들을 수 있는 시간이었다. 절차지향 데이터를 관리하는 클래스와 로직을 처리하는 클래스가 분리되어 있음 : 객체는 단지 데이터를 getter/setter 하는 용도로 밖에 사용되지않음 중앙 집중형 코드가 완성됨 : 역할에 따라 로직을 처리하지않고, 데이터를 가진 객체들이 한 곳에서 모여서 절차지향적으로 처리되다보니 변경사항이 생겼을 때 유연하지못함 객체지향 데이터(상태값)와 로직 처리를...
-
스테이트 패턴 객체의 상태가 변경됨에 따라 다르게 행동할 수 있음 : 상태 자체를 객체화하는 것이라고 이해됨 - 상태를 추상화 시킴, 상태에 따라 할 수 있는 일이 많아지고 조건문이 엄청 세분화 되어질 때 분리시켜서 관리하도록 하는 것이 좋을 듯 상태 별로 같은 행동(코드 중복 제거), 상태 별로 코드 관리(코드 관리에 편함) 볼링 게임 구현할 때 사용했던 패턴이었음 : 상태 자체가 실질적으로 쓰러뜨린 핀(입력된 값)이 유효한 값인지 아닌지 해당 프레임의 상태값이 무엇인지 정할 수 있었음 예제로 되새겨보는...
-
데이터 캐시하기(2) - 스프링 캐시 추상화, redis 글로벌 캐시 스프링 캐시 추상화 - AOP, 캐시 매니져 AOP : @Cacheable, @CacheEvict 캐시 관련 코드를 비즈니스 로직에서 덜어낼 수 있도록 어노테이션(포인트컷)을 설정해두면 프록시? CGLib? 어찌되었건 캐시 동작(read, write) @Cacheable : 캐시 서비스를 메소드 단위로 설정 어노테이션 name : 캐시 이름 메소드 파라미터(key), 리턴 데이터(value) : 파라미터가 없을 경우 기본 키 값을 생성, 파라미터가 여러개인 경우 key=”#파라미터명” 으로 설정, 객체일 경우 key=”#객체.필드명” (SpEL) @Cacheable("item") public Item findByName(String name)...
-
정리해보기 객체지향 객체지향 : 분업화, 하나의 세상을 이루기위해서 하나의 존재만이 있는 것이 아니라 여러 존재들이 협업하면서 세상을 이룸, 협업이 필요하다면 필요한 객체가 다른 객체에 메세지를 보내 요청함, 파일로 코드를 분리한 것과는 전혀 다른 개념임(저장 공간만 달리할 뿐 하나로 처리하는건 마찬가지) 객체지향의 장점 : 역할 별로 객체를 나누다보니 어떤 한 기능을 수정할 때 담당 객체의 코드만 수정해주면 됨 - 변경점이 하나로 모임, 변경사항이 생기더라도 유연하게 대처할 수 있음(코드 간의 의존성이 적기때문에 - 물론 객체지향적인 프로그래밍을 했다면),...
-
java-was 기존 코드 분석하기 서버 소켓(8080 - 웹서버가 80을 사용하고, WAS는 8080 리버스 프록시)을 만들어두고 클라이언트 소켓의 연결 요청을 기다림 클라이언트 소켓이 연결되면 클라이언트의 요청을 처리할 핸들러(쓰레드)를 실행시킴 : 클라이언트 연결 Request 만들기 Request 담당 오브젝트 테스트하면서 만들기 Request 생성자 설계 : InputStream을 인자로 받음 매번 브라우저로 요청을 보내고 HTTP 메세지를 읽지않기위해 모의 HTTP 메세지로 내용이 구성된 파일(request.txt)로도 읽을 수 있게) request.txt 읽기 gradle, maven은 정해진 디렉토리에 정해진 파일을 넣어야함 : resource를 class path에 넣어두고...
-
java-ims 다운로드 기능 수정하기 다운로드 리턴 타입 수정 이전 코드 : AttachmentService에 download를 요청해서 리턴받는 데이터의 타입이 PathResource였음 : PathResource는 프로젝트 패스에 존재하는 파일을 가져오는 API, 특정한 유형의 파일에만 국한된 코드였음 변경하기 : WritableResource로 리턴타입 변경하기 - PathResource의 상위타입(인터페이스), FileSystemResource, FileUrlResource, PathResource의 인터페이스 구체적인 타입이 아닌 확장성을 고려해서 인터페이스와 같은 추상적인 개념을 리턴타입, 파라미터 타입, 필드 타입으로 지정해야함 @GetMapping("/{id}") public ResponseEntity<WritableResource> download(@LoginUser User loginUser, @PathVariable Long issueId, @PathVariable Long id) throws IOException { . ....
-
java-ims layerd architecture - 계층을 만들어놨으면 이용하기 계층을 만들어놨으면 뛰어넘으려고 하지말고 해당 계층을 거치도록 코딩하기 아래 코드의 상황은 IssueController에서 Milestone의 정보를 얻어야하는데, 곧바로 MilestoneRepository로 가지말고 서비스 계층을 거치도록(직접적으로 사용하지말자 - 중간 계층이 상황에 따라 요청에 따른 응답 결과를 달리할 수 있도록) @Controller @RequestMapping("/issues") public class IssueController { @Autowired private MilestoneService milestoneService; @GetMapping("/{id}") public String show(@PathVariable Long id, Model model) { model.addAttribute(getEntityName(ISSUE), issueService.get(id)); model.addAttribute(getMultipleEntityName(MILESTONE), milestoneService.get()); return String.format("/%s/show", getEntityName(ISSUE)); } } 통합테스트(AcceptanceTest) 할 때, 테스트 할 때...
-
JPA - 영속성 컨텍스트 영속성 컨텍스트란 순수 객체와 데이터베이스의 중간에 위치한 계층 : 중간 계층(레이어)을 둠으로써 얻는 이점이 있기때문에, JPA는 영속성 컨텍스트라는 레이어를 둠 엔티티 매니져를 통해서 접근한다고 생각하면 됨 J2EE 환경 : 엔티티매니져 당 하나의 영속성 컨텍스트를 가지고 있음 스프링 사용 환경 : 트랜잭션 내에서 여러 엔티티매니져가 하나의 영속성 컨텍스트에 접근(사용), 영속성 컨텍스트는 트랜잭션 끝나면 삭제 영속성 컨텍스트 특징 @Id로 엔티티 식별 : 식별자 값이 없으면 안됨(에러 발생) /* 엔티티를 영속성 컨텍스트에 저장해두고 관리...
-
알고리즘 하나를 풀더라도 제대로 풀자 풀면서 알게된 것 1. 어떤 연산이라도 나머지 연산부터 해도 결과는 같음 : 숫자의 크기를 줄이는 것도 하나의 방법 2. 최대한 최대값으로 많이 나누려면 거기 조건에 맞을 때까지 맞춰주는게.... 3. 코드짜고 성공 케이스, 실패 케이스 최소 4개씩 돌려보기 4. 자바 포맷 출력 : System.out.format("$format", value) 오늘 푼 유형 1. 조합 중에 합이 가장 작은 것 구하기 : 작은 것을 하나씩 빼가면서 큰 것으로 나눠질 수 있도록 2. 연산 순서 : 나머지...
-
코드스쿼드 레벨2 과정이 거의 끝나가고 있다. 레벨2의 목표는 객체지향프로그래밍 익히기이다. 그동안 5가지의 미션을 하면서 책을 통해서만 공부하던 객체지향을 직접 느껴보았다. 과정 중에 와닿았던 것, 그리고 객체지향프로그래밍을 한다면 반드시 그래야만 하는 것, 기억해야할 것들을 이 글을 쓰면서 정리해보았다. 글에 쓰일 예제 코드들은 모두 5번째 미션이었던 볼링 프로그램 코드 중 일부(직접 짠 코드보다 다 짜고난 뒤 비교해본 마스터의 코드이다 - 코드 비교 리뷰를 하면서 느낀점이 굉장히 많아 마스터의 코드를 바탕으로 글을 써보았다) 이다. 볼링 프로그램을 택한 이유는...
-
객체 간의 관계 자바는 객체지향 언어 객체지향언어는 객체 간의 협력이라는 관점 아래 프로그래밍 서로 관계를 맺는데 그 중 중요한 상속 관계와 인터페이스 구현 관계에 대해 공부한 내용을 정리하였음 자바 객체지향의 상속과 인터페이스 자바는 객체지향 상속을 extends로 구현했음 확장(extends) 의미 구체화(특수화) 의미 : is a kind of 분류도를 만들어나감 자바는 다중 상속 안되게 막아놓음 : 지원한다면 개발자가 고려해야할게 많아짐 - 필드, 메소드명 중복되었을 때 객체의 인터페이스로 능력 확장이 가능함 : is able to 다중 상속은 못하지만...
-
상속은 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...