no-effort-no-gain의 등록된 링크

 no-effort-no-gain로 등록된 티스토리 포스트 수는 54건입니다.

[Rest API] 8. 주문조회 - DTO로 바로 조회 [내부링크]

주문조회 V4 - JPA에서 DTO로 바로 조회 V4: JPA에서 DTO로 바로 조회하여 Select절에서 원하는 데이터만 선택하여 조회하는 방법을 알아보겠다. @GetMapping("/api/v4/simple-orders") public List ordersV4() { return orderSimpleQueryRepository.findOrderDtos(); } Controller에 다음 코드를 추가한다. 이전 V3와 다른점이 보일 것이다. 바로 기존 DTO가 아니라 새로운 DTO로 반환한다. 또한, 참조하는 레포지토리도 변경되었다. 또, 엔티티를 DTO로 변환하는 작업도 없어진 것을 볼 수 있다. 지금부터 하나하나 설명 하겠다. 우선 새로 만든 레포지토리 이다. @Repository @Required..

[Rest API] 7. 주문조회 - 페치 조인 최적화 [내부링크]

주문조회 V3 - 페치 조인 최적화 @GetMapping("/api/v3/simple-orders") public List orderV3(){ List orders = orderRepository.findAllWithMemberDelivery(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } 다음과 같이 작성하고 OrderRepository에 다음 코드를 추가 한다. public List findAllWithMemberDelivery() { return em.createQuery("select o from Order o" + " join fetch o...

[Rest API] 6. 주문조회 - DTO로 변환 [내부링크]

주문조회 V2 - 엔티티를 DTO로 변환 엔티티를 외부에 노출하면 안된다. V2에서는 엔티티를 조회하여 DTO로 변환한다. @GetMapping("/api/v2/simple-orders") public List orderV2(){ List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class SimpleOrderDto { private Long orderId; private String name; private Local..

[Rest API] 5. 주문조회 - 엔티티 노출 [내부링크]

주문조회 - 엔티티 직접 노출 @GetMapping("/api/v1/simple-orders") public List orderV1(){ List orders = orderRepository .findAllByString(new OrderSearch()); return orders; } 다음과 같이 엔티티를 직접 반환 하였다. 위의 코드를 그냥 호출하면 오류가 발생한다. 그 이유는 무한 루프에 빠지기 때문이다.. 여기서 왜 무한 루프에 빠지게 될까? 바로 order가 Member, Delivery, Order_Item과 양방향 연관관계를 맺고 있기 때문이다. Order에서 Member, Delivery, Order_Item를 조회하는데 3개의 객체에서도 Order를 참조하고 있기 때문에 무한 루프가 발생..

[Rest API] 4. 조회용 샘플 입력 [내부링크]

조회용 샘플 package jpabook.jpashop; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Book; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; @Component @RequiredArgsConstructor public class InitDb { pr..

[Rest API] 3. 회원 조회 API [내부링크]

회원 조회 API 1. V1 회원 조회 API의 제일 단순한 코드이다 @GetMapping("/api/v1/members") public List membersV1(){ return memberService.findMembers(); } 무슨 문제가 있을까? 1) 문제점 엔티티가 외부에 직접 노출된다. 엔티티의 모든 값이 노출된다. 엔티티에서 특정 필드의 값을 숨기고 싶을때는 필드에 @JsonIgnore 어노테이션을 추가해야 한다. 위와 같은 응답 스펙을 맞추기 위한 로직이 추가된다. 프레젠테이션 로직이 엔티티에 추가된다. 실무에서는 같은 엔티티에 대해 API의 용도에 따라 수많은 API 스펙이 요구된다. 여러 스펙에 대한 API를 엔티티 하나에 담기는 매우 어렵다 엔티티가 변경되면 API스펙이 변한다...

[Rest API] 2. 회원 수정 API [내부링크]

회원 수정 API 회원 수정은 @PutMapping을 사용한다. 여기서 정리하자면 보통 get방식은 select post방식은 insert put방식은 update 을 사용한다. REST API에서는 put 보통 전체 업데이트를 할때 사용한다. 부분업데이트는 patch나 post를 사용하는 것이 REST API스타일에 맞다. @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); Member fin..

[Rest API] 1. 회원 등록 API [내부링크]

최근에는 Controller에서 HTML 뷰를 렌더링하지 않고 JSON과 같은 데이터를 메시지 바디에 직접 넣어서 데이터를 반환하는데 이러한 방식을 API방식이라고 한다. 이때 Controller에 @Controller가 아닌 @RestController를 사용하여 Rest API라고도 한다. 1. 회원등록 API 회원등록 API를 만들어 보려고 한다. 1) V1 @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1( @RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data..

[JAVA] 제네릭 프로그래밍 [내부링크]

제네릭 프로그래밍 자바 스프링을 하다가 제네릭 타입을 마주쳤는데 기억이 가물가물하여 다시 정리해 보았다.. 1. 클래스 제네릭 타입 자바에서는 Object가 모든 객체의 최상위 클래스이다. 즉, Object객체는 모든 인스턴스 객체를 받을 수 있다. 1) 쓰임 제네릭 클래스가 쓰이는 곳을 알아보자. public class ThreeDPrinter{ } 다음과 같이 3D프린터가 있다고 가정해보자. 3D프린터는 플라스틱과 파우더를 재료로 쓸 수 있다. 두개의 재료를 사용하는 프린터는 다음과 같이 만들어야 할까? public class ThreeDPrinter{ private Powder powder; private Plastic plastic; } 하지만 만약 플라스틱만을 사용하는 제품을 만들때는 파우더라는..

[JAVA] 자바 스트림 [내부링크]

자바 스트림 자바 스트림은 자바 8에서 기능이 추가 되었다. 람다를 활용한 기술이며, 배열 혹은 컬렉션에 대한 루프를 돌면서 여러개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 루프문을 쓰지 않아도 되어서 코드의 양이 매우 줄었고, 매우 자주 사용하는 기술 중 하나이다. 스트림 스트림은 3가지의 순서로 나타낼수 있다. 생성하기 가공하기 결과얻기 1) 생성하기 배열인 경우 배열인 경우에는 다음과 같이 스트림을 생성해야 한다. String[] arr = new String[]{"a", "b", "c"}; Stream stream1 = Arrays.stream(arr); Stream stream2 = Arrays.stream(arr, 1, 3); //1~2요소 컬렉션인 경우 컬렉션인 경우..

[Spring MVC] 참고. Controller, Service, DAO 필요한 이유 [내부링크]

Controller, Service, DAO 셋을 이해하려면 먼저 MVC패턴이 왜 등장했는지부터 알아봐야 한다. 1. MVC 패턴 기존의 서블릿과 JSP 방식은 하나의 파일에 비지니스 로직(서비스 호출) 과 뷰 렌더링(HTML)이 모두 존재 했다. 즉, 하나의 파일에 자바코드와 HTML 코드가 전부 들어가 있었다. 그러다 보니 코드의 복잡성이 올라가고 결국 유지보수가 어려워 졌다. 이러한 문제를 해결하기 위해 MVC(Model View Controller)패턴이 도입되었다. View(HTML)와 Controller(비지니스 로직)을 분리하였다. 그래서 view에서 HTTP 요청을 보내면 Controller가 비지니스 로직(회원가입, 상품주문 등)을 수행하였다. 그리고 view 렌더링에 필요한 데이터는 M..

[JPA] 10. 객체지향 쿼리 언어2 [내부링크]

객체지향 쿼리 언어2 1. JPQL- 경로 표현식 .(점)을 찍어 객체 그래프를 탐색 하는 것 m.username -> 상태 필드 m.team -> 단일 값 연관 필드 m.orders -> 컬렉션 값 연관 필드 1) 용어 정리 상태필드: 단순히 값을 저장하기 위한 경로 탐색의 끝 탐색 x 연관필드: 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 묵시적 내부 조인(inner join) 발생, 탐색o 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 묵지석 내부 조인 발생, 탐색 x From 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능 2) 명시적 조인, 묵시적 조인 명시적 조인: join 키워드 직접 사..

[JPA] 9. 객체지향 쿼리 언어1 [내부링크]

객체지향 쿼리 언어1 목차 객체지향 쿼리 언어 소개 JPQL 기본 문법과 기능 페치 조인 경로 표현식 다현성 쿼리 엔티티 직접 사용 Named 쿼리 벌크 연산 1. 객체지향 쿼리 언어 소개 1) JPA 가 지원하는 쿼리 방법 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbTemplate 함께 사용 2) JPQL //검색 String jpql = "select m From Member m where m.name like ‘%hello%'"; List result = em.createQuery(jpql, Member.class) .getResultList(); 테이블이 아닌 객체를 대상으로 하는 객체 지향 쿼리 SQL과 문..

[JPA] 8. 값 타입 [내부링크]

값 타입 목차 기본값 타입 임베디드 타입(복합 값 타입) 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 정리 1. 기본값 타입 JPA 데이터 타입 분류 엔티티 타입 @Entity로 정의된 객체 데이터가 변해도 식별자로 추적 가능 회원 엔티티의 키나 나이 값을 변경해도 식별자로 추적 가능 값 타입 int, Integerm String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없음. 값 변경시 추적 불가 숫자 100을 200으로 변경시 완전히 다른 값으로 대체됨. 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입 컬렉션 값 타입 기본값 타입 String name, int age 생명주기를 엔티티에 ..

[JPA] 7. 프록시와 연관관계 관리 [내부링크]

프록시와 연관관계 관리 목차 프록시 즉시 로딩과 지연로딩 지연 로딩 활용 영속성 전이: CASCADE 고아 객체 영속성 전이 + 고아 객체, 생명주기 1. 프록시 Member와 Team 객체가 있다. Member와 Team 은 다대일 양방향 관계이다. em.find(Member.Class(), member.getId()); 을 실행하면 Member객체와 Team 객체를 한번에 가져온다. Member와 Team을 거의 같이 사용한다면 문제가 되지 않지만, Member객체만 필요한 상황에서 Team 객체까지 Join하여 가져오는 것은 낭비 프록시 기초 em.find() VS em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이..

[JPA] 6. 고급 매핑 [내부링크]

고급 매핑 1. 상속관계 매핑 관계형 DB에서는 상속 관계x 슈퍼타입 서브 타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 모델을 실제 물리 모델로 구현하는 법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name=“DTYPE”) @DiscriminatorValue(“XXX..

[JPA] 5. 다양한 연관관계 매핑 [내부링크]

다양한 연관관계 매핑 1. 연관관계 매핑시 고려사항 3가지 다중성 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany 단방향, 양방향 연관관계의 주인(양방향일때) 2. 다대일 다대일 단방향 가장 많이 사용하는 연관관계 다대일의 반대는 일대다 다대일 양방향 외래키가 있는 쪽이 연관관계의 주인 양쪽을 서로 참조하도록 개발 3. 일대다 일대다 단방향 일대다 단방향은 일이 연관관계의 주인 테이블에서 일대다 관계는 항상 다 쪽에 외래키가 있음 객체와 테이블의 차이로 반대편 테이블의 외래키를 관리하는 특이한 구조 @JoinColumn을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용함(중간에 테이블을 하나 추가함) 단점 엔티티가 관리하는 외래키..

[JPA] 참고. @JoinColumn [내부링크]

JPA @JoinColumn @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name="member_id") private Long id; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } @Entity @Table(name="orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") privat..

[JPA] 참고. Entity, DAO, DTO, VO [내부링크]

Entity, DTO, DAO, VO 1. Entity DB 테이블과 매핑되는 클래스 2. DAO(Data Access Object) DB를 사용해 데이터를 조회하거나 조작하는 기능을 하는 오브젝트 서비스와 DB사이에서 데이터를 옮기는 역할 -> 즉, 쿼리를 날려 데이터를 가져오거나 저장 DB에 로그인, 입력, 받아오기, 수정, 삭제 등의 작업들을 정의한 클래스 JPA Repository객체들이 일반적으로 DAO 역할을 함 3. DTO(Data Transfer Object) 계층간 데이터 교환을 위한 객체 DB에서 얻은 데이터를 Controller나 Service 로직에서 사용하기 위한 객체 로직 없이 데이터와 getter, setter만 존재 Request, response용 DTO: View를 위한 ..

[JPA] 에러. SQL Error 23505 [내부링크]

h2DB를 띄워놓고 코드를 실행하는 와중에 에러)SQL Error 23505가 발생하는 문제가 생겼다. 찾아보니 h2버전과 하이버네이트(JPA) 버전 호환 관련해서 생긴 문제인것 같다. h2 1.4.200버전을 사용하면 하이버네이트 버전을 5.4.13.Final로 변경해주어야 한다. 해당 오류가 발생한 분들은 pom.xml파일에서 하이버네이트 버전을 변경해야 한다. 하이버네이트의 버전을 번경하기 싫다면 h2 버전을 1.4.199로 낮춰도 정상작동 한다.

[JPA] 4. 연관관계 매핑 기초 [내부링크]

연관관계 매핑 기초 1. 목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 2. 연관관계가 필요한 이유 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. -조영호(객체지향의 사실과 오해)- 예를 들어 member와 team이 있다고 가정 하나의 member는 하나의 team에 소속될 수 있고 하나의 team에는 여러 member가 소속될 수 있다.(다대일 관계) 객체를 테이블에 맞추는 모델링 참조 대신 외래 키 식별자를 직접 다룸 참조객체를 찾기 위해서는 member객체를 찾고 team의 식별자로 다시 조회 해야 한다.(즉 select문이 2번 발생) 객체를 테이블에 맞추어 모델링하면 협력관계를 만들수 없음. 테이블은 외래 키로 조인을 사용하여 연관된..

[DATABASE] DDL, DML, DCL [내부링크]

DDL(Data definition Language) - 데이터 정의어 데이터 베이스를 정의하는 언어를 의미. 데이터를 생성하거나 수정, 삭제 등 데이터의 전체 골격을 결정 하는 언어 CREATE 데이터 베이스, 테이블 등을 생성 ALTER 테이블 수정 DROP 데이터베이스, 테이블 삭제 TRUNCATE 테이블 초기화 DML(Data Manipulation Language) - 데이터 조작어 정의된 데이터베이스에 입력된 레코드 조회 혹은 수정, 삭제 하는 언어. 테이블에 있는 행과 열을 조작하는 언어. 사용자가 던지는 실질적인 질의 이다. SELECT 데이터 조회 INSERT 데이터 삽입 UPDATE 데이터 수정 DELETE 데이터 삭제 DCL(Data Control Language) - 데이터 제의어 ..

[JPA] 3. 엔티티 매핑 [내부링크]

엔티티 매핑 객체와 테이블 매핑: @Entity, @Table 필드와 컬럼 매핑: @Column 기본 키 매핑: @Id 연관관계 매핑: @ManyToOne, @JoinColumn 1. 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. 주의 기본 생성자 필수!! final 클래스, enum, interface, inner클래스에는 사용 불가능! 저장할 필드에 final 사용 불가능 @Entity 속성 정리 속성: name JPA에서 사용할 엔티티 이름 기본값: 클래스 이름 그대로 사용 @Table @Table은 엔티티와 매핑할 테이블 지정 Table 속성 정리 속성 기능 기본값 name 매핑할 테이블 이름 엔티티 이름을 사용 catalog 데이터베이스 cata..

[JPA] 2. 영속성관리 [내부링크]

JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑 영속성 컨텍스트 엔티티 매니저 팩토리와 엔티티 매니저 고객 요청이 올때마다 웹 어플리케이션에서 미리 생성된 엔티티 매니저 팩토리가 엔티티 매니저를 생성하여 할당해줌. 엔티티 매니저는 DB connection pool을 사용하여 DB에 접근 영속성 컨텍스트 눈에 보이지 않음 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 J2SE 환경: 엔티티 매니저와 영속성 컨텍스트가 1:1 J2EE, 스프링 프레임워크 같은 컨테이너 환경: 엔티티 매니저와 영속성 컨텍스트가 N:1 엔티티의 생명주기 비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 new로 객체를 생성한 상태 영속 영속성 컨텍스트에 관리되는 상태 persist로 객체를 영속성 컨텍스트에 ..

[JPA] 1. 환경세팅 [내부링크]

1. 프로젝트 생성 메이븐 설정 • groupId: jpa-basic • artifactId: ex1-hello-jpa • version: 1.0.0 라이브러리 추가 - pom.xml 자바 11 4.0.0 org.example jpa-basic 1.0-SNAPSHOT 11 11 UTF-8 javax.xml.bind jaxb-api 2.3.0 org.hibernate hibernate-entitymanager 5.3.10.Final com.h2database h2 1.4.200 JPA 설정하기 - persistence.xml JPA 설정 파일 • /META-INF/persistence.xml 위치 JPA 구동 방식 persistence.xml파일을 조회하여 Persistence 생성 Persistence가..

[JPA] 0. JPA 소개 [내부링크]

JPA 소개 1. SQL 중심적인 개발의 문제점 지금 시대는 객체를 관계형 DB에 관리하는 시대 객체 CRUD(CREATE, READ, UPDATE, DELETE) 무한 반복 객체 와 관계형 DB의 패러다임 불일치 상속: 관계형 DB에는 상속이라는 개념이 없어서 관련된 TABLE에 모두 쿼리를 날리거나 JOIN을 통해 조회해야함.) 연관관계: 객체는 참조를 사용, 테이블은 외래 키를 사용 데이터 타입 데이터 식별 방법 객체 그래프 탐색: 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 함 SQL은 JOIN에 따라 탐색 범위가 결정 엔티티 신뢰 문제: 온전히 객체가 모든 기능을 다 수행해야 신뢰할 수 있는데 SQL문에 따라서 member.getTeam()에 값이 들어갈 수도 , null이 될 수도 있어서 ..

[Spring MVC] 8. @PathVariable VS @RequestParam [내부링크]

@PathVariable VS @RequestParam @PathVariable @RequestMapping 은 URL 경로를 템플릿화(동적 처리) 할 수 있는데, @PathVariable 을 사용하면 매칭 되는 부분을 편리하게 조회할 수 있다. 예) items/{itemId} 일때 @PathVariable("itemId")을 사용하면 itemId 조회 가능 변수 이름이 같을 때 @PathVariable로 생략 가능 예) @PathVariable("itemId") Long id -> @PathVariable Long itemId @RequestParam URL 경로로 GET 쿼리 파라미터(ex) xxx?username=kim) 요청이 오거나 Post로 HTML Form으로 파라미터가 넘어올때 해당 파라미..

[Spring MVC] 7. 스프링 MVC - 웹 페이지 만들기 [내부링크]

스프링 MVC - 웹 페이지 만들기 1. 요구사항 분석 상품 도메인 모델 상품 ID 상품명 가격 수량 상품 관리 기능 상품 목록 상품 상세 상품 등록 상품 수정 프론트엔드 개발자가 만든 html 폼 상품목록(등록, 상세 버튼) 상품등록 폼(저장, 취소 버튼) 상품 상세(수정, 목록 버튼) 상품 수정 폼(저장, 취소 버튼) 1) 클라이언트가 상품 목록 요청 2) `상품목록 controller`에서 `상품목록 폼` 랜더링 2-1) 상품등록 버튼 클릭 -> `상품등록 controller`에서 `상품등록 폼` 랜더링 3-1) 상품저장 버튼 클릭 -> `상품저장 controller`에서 `상품상세 폼` 랜더링 3-2) 취소 버튼 클릭 -> `상품등록 폼`에서 `상품목록 링크`로 이동 2-2) 상품상세 버튼 클릭 ..

[Spring MVC] 5. 스프링 MVC - 구조 이해 [내부링크]

스프링 MVC - 구조 이해 1. 스프링 MVC 전체 구조 직접 만든 프레임워크 스프링 MVC 비교 FrontController -> DispatcherServlet handlerMappingMap -> HandlerMapping MyHandlerAdapter -> HandlerAdapter ModelView -> ModelAndView viewResolver -> ViewResolver MyView -> View DispatcherServlet 구조 스프링 MVC도 프론트 컨트롤러 패턴으로 구현 프론트 컬르롤러가 디스패처 서블릿 디스패처 서블릿도 부모 클래스에서 HttpServlet을 상속받아 서블릿으로 동작 스프링 부트는 디스패처 서블릿을 자동으로 등록하면서 모든경로(urlPatterns="/")에 ..

[Spring MVC] 6. 스프링 MVC - 기본 기능 [내부링크]

스프링 MVC - 기본 기능 1. 프로젝트 생성 스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성 https://start.spring.io 프로젝트 선택 Project: Gradle Project Language: Java Spring Boot: 2.4.x Project Metadata Group: hello Artifact: springmvc Name: springmvc Package name: hello.springmvc Packaging: Jar (주의!) Java: 11 Dependencies: Spring Web, Thymeleaf, Lombok war를 사용하면 /webapp/ 경로에 index.html 을 두면 http://localhost:8080 호출시 index.html 페이..

[Spring MVC] 4. MVC 프레임워크 만들기 [내부링크]

MVC 프레임워크 만들기 1. 프론트 컨트롤러 패턴 소개 FrontController 패턴 특징 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받는다. 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다. 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출해준다. 스프링 웹 MVC와 프론트 컨트롤러 스프링 웹 MVC의 DIspatcherServlet이 FrontController 패턴으로 구성 2. 프론트 컨트롤러 도입 - v1 V1 구조 HTTP요청이 오면 프론트 컨트롤러에 URL매핑 정보에서 컨트롤러를 조회한다. 조회한 컨트롤러를 호출한다. 해당 컨트롤러에서 직접 JSP forward를 수행한다. view 렌더링이 수행된다. 프론트 컨트롤러 분석 urlPatterns url..

[Spring MVC] 3. 서블릿, JSP, MVC 패턴 [내부링크]

서블릿, JSP, MVC 패턴 1. 회원 관리 웹 애플리케이션 요구사항 회원 정보 이름: username 나이: age 기능 요구사항 회원 저장 회원 목록 조회 회원 도메인 모델 id 는 Member 를 회원 저장소에 저장하면 회원 저장소가 할당한다 회원 저장소 회원 저장소는 싱글톤 패턴을 적용했다. 스프링을 사용하면 스프링 빈으로 등록하면 되지만, 지금은 최대한 스프링 없이 순수 서블릿 만으로 구현하는 것이 목적이다. 싱글톤 패턴은 객체를 단 하나만 생생해서 공유해야 하므로 생성자를 private 접근자로 막아둔다 회원 저장소 테스트 코드 회원을 저장하고, 목록을 조회하는 테스트를 작성했다. 각 테스트가 끝날 때, 다음 테스트에 영향을 주지 않도록 각 테스트의 저장소를 clearStore() 를 호출해..

[Spring MVC] 2. 서블릿 [내부링크]

서블릿 Hello 서블릿 @ServletComponentScan : 해당 패키지와 하위 패키지의 servlet을 모두 찾아서 등록해준다. @WebServlet : 서블릿 애노테이션 name : 서블릿 이름 urlPatterns : URL 매핑 HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다. protected void service(HttpServletRequest req, HttpServletResponse resp) 개발시 편리하게 HTTP 요청 메시지를 다 보고싶다면? application properties에 다음 문장을 추가하자. logging.level.org.apache.coyote.http11=debug 참고 운영서버에 모든 요청정보를 다 남기면 성능..

[Spring MVC] 1. 웹 애플리케이션 이해 [내부링크]

웹 애플리케이션 이해 웹서버, 웹 애플리케이션 서버 웹 서버는 정적 리소스(파일), WAS(Web Application Server)는 정적 리소스 파일 제공 및 애플리케이션 로직 실행 웹 서버도 프로그램을 실행하는 기능을 포함하기도 하며,WAS도 웹 서버의 기능을 제공하기 때문에 둘 용어의 경계가 모호함 WAS는 애플리케이션 코드를 실행하는데 더 특화 웹 시스템 구성 - WAS, DB WAS, DB만으로 시스템 구성 가능 WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능 WAS가 너무 많은 역할을 담당, 서버 과부하 우려 비싼 애플리케이션 로직이 정적 리소스로 인해 수행이 어려울 수 있음 WAS장애시 오류 화면도 노출 불가능 웹 시스템 구성 - WEB, WAS, DB 정적 리소스는 웹 서버가 처..

객체 지향 설계와 스프링 [내부링크]

객체지향 프로그래밍이란 일반적으로 나열하는 형식의 프로그래밍에서 벗어나 객체를 중심으로 프로그래밍하는 것을 의미한다. 좋은객체지향 프로그래밍이란 역할과 구현을 잘 구분한 프로그래밍이다. 즉, 인터페이스와 구현클래스로 나누어 프로그래밍 하는 것을 의미한다. 인터페이스와 구현클래스를 나누면 좋은 이유는 변화에 대비하는 프로그래밍이기 때문이다. 예를들어, 영화관에서 A할인정책을 시행하고 있다고 하자. 이때, B할인정책으로 바꿀려고 한다. 만약, 할인정책을 인터페이스로 두지 않고, A할인정책 클래스, B할인정책 클래스가 구현되어 있다면, 각 할인정책마다 공통적인 코드가 중복되어서 코드가 간결하지 않을 수 있고, 여러 개발자가 함께 개발하는 환경에서, 해당 할인 정책이 어떤 메소드를 가지고 있는지 알기 위해서는 ..

6주차 활동내용 [내부링크]

로그인, 회원가입 하기 다음과 같은 코드를 작성함. usercontroller.java package com.jerry.blog.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class UserController { @GetMapping("/joinForm") public String joinForm() { return "user/joinForm"; } @GetMapping("/loginForm") public String loginForm() { return "user/loginForm"; } } bo..

5주차 활동내용 [내부링크]

https://no-effort-no-gain.tistory.com/8 어노테이션 8월 5일 모각소 공부내용이다. 자바 스프링 부트에서 @표시를 어노테이션이라고 한다. 다음 코드를 보도록 하자. package com.jerry.blog.model; import java.sql.Timestamp; import javax.persistence.Column; im.. no-effort-no-gain.tistory.com

4주차 활동내용 [내부링크]

4주차 활동내용 https://no-effort-no-gain.tistory.com/7?category=953484 Enum 7월 30일 모각소 공부내용이다. Enum Enum을 사용하는이유는 잘못된 값을 사용함으로써 발생하는 에러 및 위험을 방지하기 위해서이다. 예를 들어 메뉴에 아메리카노 아이스 아메리카노 카페라떼 no-effort-no-gain.tistory.com

3주차 활동내용 [내부링크]

3주차 활동내용 https://no-effort-no-gain.tistory.com/4 접근 제어자 7월 23일 모각소 공부내용이다. 자바에서 접근제어자는 변수나 메소드 앞에 사용하여 권한을 설정한다. 접근제어자 1.private 2.default 3.protected 4.public private 접근제어자가 private이라면 해당 변수, 메 no-effort-no-gain.tistory.com 스프링부트 공부를 위한 sts, mysql, postman 설치

2주차 활동 내용 [내부링크]

2주차 활동 내용 https://no-effort-no-gain.tistory.com/2 자료형-숫자 7월 9일 모각소 공부는 https://blog.naver.com/jerry3269에 올려놓았다. 7월 16일 모각소 공부 내용이다. 정수 자바에서 정수를 표현하는 자료형은 int, long이 있다. int 는 -2147483648 ~ 2147483647 까지 long.. no-effort-no-gain.tistory.com scpc 예선 개미 문제 /* If you remove the statement below, your program's output may not be recorded when your program is terminated after the time limit. For safety..

1주차 활동 내용 [내부링크]

자바 문법공부 및 scpc 기출문제 풀기 https://blog.naver.com/jerry3269 jerry3269님의 블로그 : 네이버 블로그 안녕하세요. 코딩 공부 블로그입니다. blog.naver.com scpc 7회예선 친구들 문제 NN명의 사람들이 좌우로 서 있다. 사람들은 왼쪽에서 순서대로 1번부터 번호가 붙어 있다. 사람들 사이의 친구 관계는 사람들이 들고 있는 자연수를 이용하여 아래 규칙으로 알아낼 수 있다. 아래 규칙에 따라 만들어지지 않는 친구 관계는 없다. - 번호 ii인 사람은 자연수 DiDi를 가지고 있다. ( 0ii인 사람은 번호 i+Dii+Di인 사람과 친구 관계이다. 친구 관계는 대칭적이다. 즉, 한쪽만 상대방이 친구라고 생각하는 경우는 없다. 만약 번호 i+Dii+Di인 ..

6주차 활동 계획 [내부링크]

로그인 및 회원가입 기능 구현

5주차 활동 계획 [내부링크]

스프링부트에서 자주쓰이는 여러 어노테이션에 대한 공부 및 쓰임새 공부

4주차 활동계획 [내부링크]

자바 문법공부 및 스프링부트로 나만의 블로그 만들기 프로젝트 시작

3주차 활동 계획 [내부링크]

scpc 예선에 탈락하여 자바 문법공부를 더 열심히 하였다. 자바공부도 하면서 스프링부트에 대한 공부도 겸하여 같이 진행할계획이다.

2주차 활동 계획 [내부링크]

scpc 예선을 치르고 모각소에서 만나 예선 문제풀이에 대한 피드백을 진행하고 나머지 시간엔 자바 문법 공부

1주차 활동 계획 [내부링크]

자바 문법 공부 및 scpc 코딩테스트 예선 준비

[JAVA] 어노테이션 [내부링크]

8월 5일 모각소 공부내용이다. 자바 스프링 부트에서 @표시를 어노테이션이라고 한다. 다음 코드를 보도록 하자. package com.jerry.blog.model; import java.sql.Timestamp; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import org.hibernate.annotati..

[JAVA] Enum [내부링크]

7월 30일 모각소 공부내용이다. Enum Enum을 사용하는이유는 잘못된 값을 사용함으로써 발생하는 에러 및 위험을 방지하기 위해서이다. 예를 들어 메뉴에 아메리카노 아이스 아메리카노 카페라떼 가 있다고 가정하자. 하지만 손님이 초코라떼를 주문하면 에러가 발생할 수 있다. Enum을 이용하면 이러한 주문을 사전에 차단할 수 있다. 즉 주문메뉴의 범위를 제한할 수 있다. 다음 코드를 살펴보자. public class Sample { enum CoffeeType { AMERICANO, ICE_AMERICANO, CAFE_LATTE }; public static void main(String[] args) { System.out.println(CoffeeType.AMERICANO); // AMERICANO ..

[JAVA] 생성자 [내부링크]

생성자(Constructor) 다음코드를 살펴보자 class Dog { String name; void setName(String name) { this.name = name; } } public class Sample { public static void main(String[] args) { Dog dog = new Dog(); System.out.println(dog.name); // null 출력 } } 이러한 코드의 결과는 null이다. 그 이유는 Dog 이라는 객체에 아무런 name도 설정해 주지 않아서 이다. 생성자를 이용하면 name이라는 객체변수에 값이 설정되었을때만 객체가 생성될 수 있도록 강제 할 수 있다. Dog 객체에 다음과 같은 메서드를 추가해보자. class Dog { Stri..

[JAVA] 정적 변수와 메소드 [내부링크]

static class Counter { int count = 0; Counter() { this.count++; System.out.println(this.count); } } public class HelloSpringApplication { public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); } } 다음과 같은 코드가 있다고 가정할때 위 코드는 다음과 같은 결과값이 나온다. 1 1 서로다른 객체를 생성하여 다른 객체를 가르키고 있기 때문에 발생하는 결과이다. 다음 예제를 살펴보자 class Counter { static int count = 0; Counter() { count+..

[JAVA] 접근 제어자 [내부링크]

7월 23일 모각소 공부내용이다. 자바에서 접근제어자는 변수나 메소드 앞에 사용하여 권한을 설정한다. 접근제어자 1.private 2.default 3.protected 4.public private 접근제어자가 private이라면 해당 변수, 메소드는 해당 클래스에서만 접근할 수 있다. public class Sample { private String a; return this.a; } 예제에서 a변수는 해당 Sample 클래스에서만 접근이 가능하다. default 접근제어자를 입력하지 않으면 자동으로 default 접근제어자로 설정되어 해당 패키지 내에서만 접근할 수 있다. protected 접근제어자가 protected라면 해당 패키지의 클래스 또는 해당 클래스를 상속받는 다른 패키지의 클래스에서 ..

[JAVA] 자료형-문자열 [내부링크]

자바 문법은 점프투 자바에 기초하여 작성한다. 문자열 자바에서 문자열을 나타내는 자료형은 String이다. 다음과 같이 사용된다. String a = "hello world"; String b = "a"; 다음의 표현도 살펴보자. String a = new String("hello world"); String b = new String("a"); new는 객체를 의미한다. 객체는 나중에 다시 알아보자. 원시(primitive) 자료형 int, long, double, float, boolean, char등을 원시 자료형이라고 부른다. 이러한 자료형은 new로 객체를 생성할 수 없다. 원시자료형은 다음처럼 각각 대응하는 wrapper class가 존재한다. 원시자료형 Wrapper class int Int..

[JAVA] 자료형-숫자 [내부링크]

7월 9일 모각소 공부는 https://blog.naver.com/jerry3269에 올려놓았다. 7월 16일 모각소 공부 내용이다. 정수 자바에서 정수를 표현하는 자료형은 int, long이 있다. int 는 -2147483648 ~ 2147483647 까지 long 은 -9223372036854775808 ~ 9223372036854775807 까지 표현할 수 있다. 다음과 같이 사용한다. int a = 0; long b = 21474836478L; long 변수에 값을 대입할때 숫자 값이 int 자료형의 최대값인 2147483647보다 큰 경우 숫자 마지막에 L(또는 소문자l)을 붙여준다. 만약 이를 빼먹으면 컴파일 에러가 발생한다. 실수 자바에서 실수를 표현하는 자료형은 float, double ..