기본 콘텐츠로 건너뛰기

7월, 2018의 게시물 표시

웹 어플리케이션이 나오기까지

이번 시간엔 웹 어플리케이션이 나오게 되기까지 과정을 알아보자. 데스크톱 애플리케이션 1. PC에 설치되어 실행되 웹 애플리케이션 보다 실행속도가 빠름.     - office, 컴퓨터 게임 등등... 2. 문제점   - 배포의 번거로움.   - 보안에 취약 : 데이터 베이스에 접근할 때 취약 가능성   - 애플리케이션 실행할 때 먼저 서버에 갱신된 버전이 있는지 조회 후 실행하면 어느정도 해결됨.   - 단 보안에 취약...   클라이언트'서버 애플리케이션   - 애플리케이션의 기능을 서버와 클라이언트로 분리.   - 장점     - 새로 프로그램이 수정 되도 서버 쪽만 변경하면 됨.     - 기능 변경/추가에 유연하게 대처가 됨.   - 문제점 개선 방안     - 한번에 하나의 클라이언트 하고만 연결 됨.     - 멀티 프로세스와 멀티 스레드로 위 문제를 해결한다.   - 멀티 프로세스와 멀티 스레드     - 멀티 프로세스는 원본 프로세스의 메모리를 모두 복제해 자원 낭비가 심함.     - 멀티 쓰레드는 전체 메모리를 복제할 필요가 없음.     다중 클라이언트 요청 처리   - 클라이언트의 요청 처리 부분을 별도의 작업으로 분리   - 분리된 작업은 스레드에 정의   - 다중 클라리언트 요청이 병행 처리됨.   - C/S 환경의 프로그래밍이 복잡해지는 문제가 생김.   클라이언트'서버 아키텍처의 진화 1. 전통적인 클라이언트'서버 아키텍처     - 서버는 데이터 처리를 맡고 클라이언트는 UI와 비즈니스를 처리했다.     - 단점         - 프로그램이 변경되면 PC에 다시 설치해야됨...         - 클라이언트가 DBMS로 바로 접속해 보안 문제 발생.         2. 개선된 클라이언트'서버 아키텍처     - 클라이언트의 업무 처리부분은 서버로 이관.     - 클라이언트는 오직 UI만 담당.     - 서버로부터 결과를

[SpringBoot] Spring Data JPA를 알아보자 [2탄 엔티티를 다루기]

이번 시간에는 엔티티 클래스 설계서 부터 테스트까지 진행해 보도록 하겠다. 1. 엔티티 클래스 설계   - JPA는 자동으로 테이블을 생성하는 기능을 가질 수 있다. 다음 2가지 방법이 있다.     1) SQL을 이용해 테이블을 먼저 생성하고 엔티티 클래스를 만드는 방법     2) JPA를 이용해 클래스만 설계하고 자동으로 테이블을 생성하는 방법   - 이중에서 2)번 방법을 알아보자.   - JPA 엔티티 클래스를 생성하는 작업은 다음 과정을 거친다     1) 클래스 설계     2) 각종 애너테이션을 이용해 제약 조건 추가 설정     3) 엔티티 간 연관관계 설정 1.1 엔티티 클래스 설계    package com . example . sutdy . domain ; import lombok.Getter ; import lombok.Setter ; import lombok.ToString ; import java.sql.Timestamp ; @Getter @Setter @ToString public class Board { private Long bno; private String title; private String writer; private String content; private Timestamp regdate; private Timestamp updatedate; }   - 위와 같이 일반적인 방법으로 클래스를 만들어 봤다. 다음 JPA 어노테이션에 관해 알아보고 붙여보자 1.1.2 JPA 어노테이션   - @Id : 각 엔티티를 구별할수 있도록 식별 ID부과.(일종의 primary key로 보면된다). 모든 엔티티에 반드시 지정하자.   - @Column : 인스턴스 변수가 컬럼이 되기 원한다면 지정해주자. name, nullable등 다양한 속성이 있다.   - @Table : 클래스가 테이블이 되기 때문에 클래스 선언부

[자바 웹 프로그래밍]3장 개발 환경 구축 및 웹 서버 실습 요구사항

3장에 나온 내용 정리와 책 소개를 정리하였다. 1. 책소개   - 리눅스 커맨드라인 완벽입문서(2013)   - HTTP 완벽 가이드 - 수준이 쌓이면 보자   - HTTP & Network : 그림으로 배우는~ - 그림도 많고 내용도 쉽게 풀어 써있는듯 하다. 2. 웹 서버 실습   - InputStream : 클라이언트에서 서버로 요청을 보낼 때 전달되는 데이터 담당 스트림.   - OutputSTream : 서버에서 클라이언트에 응답을 보낼 때 전달되는 데이터를 담당하는 스트림   - 프로그래밍 중 좋은 습관은 프로그래밍 실행 중 발생하는 로그 메시지를 주의깊게 보는 것이다.   - 정상으로 실행되고 있는지 판단할 수 있다.   - 작성 중 새로 알게된 내용 또는 용어는 README.md 파일에 작성하자. 마크다운 문법을 따름.   - 각 요청마다 클라이언트의 포트는 서로 다른 포트로 연결한다.   - 서버는 각 요청에 대해 순차적으로 실행하는 것이 아니라 동시에 각 요청에 대응하는 스레드를 생성해 동시에 실행한다.   - HTTP 요청에 대해 요청라인, 요청 헤더, 빈 공백 문자열은 필수고, 요청 본문은 필수가 아니다.   - 요청라인 : "HTTP-메소드 URI HTTP-버전".   - 요청 헤더 : <필드이름> : <필드 값> 쌍으로 이뤄졌다.   - 응답 메시지에는 상태라인, 응답헤더, 빈 공백, 응답 본문이 들어있다.   - /user/create?userId=java&name=javaoh 에서 /user/create는 경로, ?뒤는 '쿼리스트링'이라 부른다.   - POST 방식으로 요청을 하면 쿼리 스트링은 HTTP body에 전달 된다. Content-Length라는 필드 이름으로 본문데이터 길이가 전달된다.   - 구한 길이만큼 본문을 읽은 후 본문 데이터를 Map<String, String> 형태로 변환하면 된다.  

[Java] 제네릭(generic)을 알아보자

제네릭(generic)  C++에 템플릿이 있다면 Java엔 제네릭이란 객체 상용구 생성을 최소화 하기 위한 문법이 있다. 그럼 제네릭에 대해 한번 알아보자. 1. 제네릭을 왜 사용하는가?   - 제네릭을 사용하면 다음 장점 들이 있다.     1) 컴파일 시 강한 타입 체크가 가능하다       - 컴파일 시 미리 타입을 체크해 코드에서 잘 못 사용된 타입이 발생하는걸 막는다.     2) 타입 변환을 제거한다.       - 제네릭을 쓰지 않으면, 읽기/쓰기 시 형변환이 필요한 경우가 생긴다.       - 이는 성능상 문제가 될 수 있는데, 제네릭을 사용하면 형변환 없이 사용가능해진다. 2. 제네릭 타입   - 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.   - 클래스 또는 인터페이스 이름 뒤에 '<>'가 붙고 사이에 파라미터가 위치한다. package generics; public class Box { private T t; public T get() { return t; } public void set(T t) { this.t = t; } } package generics; public class BoxExam { public static void main(String[] args) { Box box = new Box<>(); box.set("hello"); String str = box.get(); System.out.println(str); } } 3. 제네릭의 제한   - static 멤버 타입에는 사용할 수 없다. 제네릭은 인스턴스 변수로 간주하기 때문이다.   - static 멤버는 메서드에 지네릭 타입을 선언하고 사용하는 것은 가능하다.   - 메서드 지네릭 타입 배열은

[SpringBoot] Spring Data JPA를 알아보자 [1탄 JPA소개 및 설정]

Spring Data JPA   윈도우 프로그래밍과 java 어플리케이션 개발 과정 중, DB를 사용하기 위해 이런 저런 환경설정으로 매우 많은 번거로움이 있었다. JPA를 알게 된 이후로 이 모든 설정 및 쿼리 사용에 대한 부담감이 완전 줄어 든 데에 Spring을 만든사람에게 박수를 보내고 싶다.  자 그럼 이번 시간은 JPA가 무엇이고, JPA를 사용하기위한 환경설정을 알아보자. 1. JPA소개   - Spring Data JPA는 JPA(Java Persistence API)란 기술을 스프링에서 개발할 수 있도록 돕는 라이브러리다.   - 다양한 데이터베이스에 종속적인 SQL문 없이도 개발이 가능해졌다.   - Java를 이용해 데이터 관리 기법의 하나의 스펙 표준이다.   - JPA를 구현한 구현체 중 스프링 부트에선 'Hibernate'를 이용한다.   - JPA를 이용하면 Java로 작성된 클래스, 객체, 데이터베이스 테이블, 레코드를 자동으로 관리된다. 2. 용어를 알아보자   - 엔티티(Entity) : 데이터베이스상 데이터로 관리하는 대상. JPA에선 Java를 이용해 엔티티 관리하는데, 엔티티 타입의 존재는 클래스이다.   - 엔티티매니저 : 자신이 관리해야 하는 엔티티 객체들을 '영속컨텍스트'란 곳에 넣어 객체들의 생사를 관리한다.   - 영속 컨텍스트 : JPA가 엔티티 객체들을 모아두는 공간이다. 다음 상태가 있다.     1) 비영속(New) : Java 영역에 객체만 존재하고, 데이터베이스와 연동이 없는 상태.     2) 영속(Managed) : 데이터베이스에 저장되고 메모리상에도 존재. 객체가 영속 컨텍스트에 들어가고 id(PK)로 엔티티 객체를 꺼내 사용할 수 있다.     3) 삭제(Removed) : 데이터베이스상에서 삭제된 상태     4) 준영속(Detached) : 영속 컨텍스트에서 객체를 꺼내 사용하는 상태. 3. Spring Data JPA 특징

[SpringBoot] 테스트를 해보자

스프링 부트 테스트  자바 웹개발(양파껍질) 스터디를 하면서 리팩토링과 테스트코드에 중요함을 점점 느끼고 있다. 스프링 부트에서 간단하게 프로젝트 테스트를 진행해 볼 수 있는데 한번 알아도록 하자. 1. Controller 테스트를 해보자   - 프로젝트 폴더를 보면 'src/test/java'에서 파일을 생성해 진행하자.('src/main/java가 아님!)   - 최근 스프링 부트 테스트를 세분화해 @DataJpaTest, @JsonTest등 다양한것이 나왔다.   - 테스트 클래스에 @WebMvcTest어노테이션을 추가해 특정 컨트롤러를 지정해주자.   - @WebMvc = @Controller + @Component + @ContollerAdvice +... 등을 인식.   - 컨트롤러를 테스트 하려면 MockMvc 타입 객체를 사용해야 하는데, @WebMvc붙여 주면 별도 생성없이 주입 된다. package com.example.sutdy; import com.example.sutdy.controller.VoController; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servle

[SpringBoot] Lombok을 써보자

Lombok 1. Lombok은 무엇을 하는가?   - Java 개발을 하다 보면 class 변수에 따라 Getter/Setter/toString() 메서드를 일일히 작성해야 했다.   - Lombok은 이러한 것을 단순 자동화 함으로써 개발 시간을 단축 시켜 주었다.   - 즉 Lombok 라이브러리는 Java코드를 컴파일 할 떄 자동으로 추가 메소드를 만들어 컴파일 해주는 라이브러리다. 2. 사전 작업   -  롬복을 사용하기 위해선 우선 롬복 설치 후 해당 IDE에 적용을 시켜 줘야 한다.   -  자세한 사항은 'Eclipse 롬복 설치 / Intellij 롬복 설치'라고 검색하면 친절한 블로거님들이 잘 설명해 놓았다. 3. Lombok의 어노테이션  어노테이션이 여러가지 있지만 그 중 자주 사용하는 것을 정리해 보겠다.   - @NonNull : Null 값이 될 수 없다는 것을 명시.   - @Getter/@Setter : Getter / Setter 메서드를 자동 생성한다.   - @ToString : toString() 메서드를 생성한다.   - @EqualsAndHashCode : eqals()와  hashCode() 메서드를 생성한다.   - @Synchronized : 메서드에 동기화를 설정한다. 4. Lombok을 사용해 보자 package com.example.sutdy.domain; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class vo1 { private String val1; private int n; private boolean b; }  위를 보면 getter / setter / toString() 메서드가 없는 것을 확인 할 수 있다.  다음 이것이 잘 동작 하는지 보자. package com.example.

[자바 웹 프로그래밍]2장 문자열 계산기 구현을 통한 테스트와 리펙토링

이번엔 2장에 나와 있는 내용 정리와 느낀점을 정리 해 보겠다. 1. main() 메소드를 활용한 테스트의 문제점.   - 소스코드 구현 후 정상적으로 동작하는지 확인 위해 일반적인 방법은 main()메소드를 활용하는 것이다.   - 실제 서비스를 담당하는 프로덕션 코드와 이 프로덕션 코드가 정상 동작 하는지 확인을 위한 main() 으로 나뉜다.   - 이 방법의 첫번째 문제점은 프로덕션코드와 main() 메서드가 함께 있다는 것이다.   - 프로덕션 코드와 테스트코드(main)을 분리할 수 있다.   - 두 번째 문제는 내가 구현하고 있는 메서드만 집중 할 수 없고, 클래스가 가지고 있는 모든 메서드를 테스트 할 수 밖에 없다.   - 다른 문제는 항상 콘솔로 확인을 할 수 밖에 없다는 것이다.   - 이를 위해 등장한 라이브러리가 JUnit 이다. 내 관심을 가지는 메서드에 대해 테스트 가능하다. 2. JUnit을 활용해 main() 메서드 문제 극복 2.1 한 번에 메서드 하나에만 집중.   - JUnit관련 라이브러리 추가 후  테스트 메서드에 @Test를 붙이면 된다.   - test 관련 코드 작성 후 Run > Run as> JunitTest를 실행해 보자.   - 각각 테스트 메서드를 독립적으로 실행할 수 있기 때문에 현재 내가 구현하고 있는 프로덕션 코드의 메서드에 집중할 수 있다. import org.junit.Test; public class CalculatorTest { @Test public void add() { Calculator cal = new Calculator(); System.out.println(cal.add(1,2)); } } 2.2 결과 값을 눈이 아닌 프로그램을 통해 자동화 import org.junit.Test; import static org.junit.Assert.assertEquals;

[알고리즘]그래프를 알아보자

알고리즘 스터디 중 DFS를 공부하다 그래프에 대해 제대로 된 개념이 탑재된것 같지 않아 블로그를 남겨 보려 한다. 그래프 1. 용어   - 그래프는 정점(Vertex)과 간선(Edge)의 집합으로 하나의 간선은 두 개의 정점을 연결한다.   - 간선에 방향이 있으면 방향그래프, 방향이 없으면 무방향 그래프라 한다.   - 정점 a와 b를 연결하는 간선을 (a,b)로 표현하고, 방향이 있는 경우 <a,b>로 표현한다.   - 정점 a에 인접한 정점의 수를 a의 '차수'라고 정의한다.   - 방향그래프에서는 차수를 진입차수, 진출차수로 구분한다.   - 시작 정점과 도착점이 동일한 단순경로를 싸이클이라고 한다.   - 그래프에서 정점들이 서로 연결되어 있는 부분을 연결성분(Component)라 한다.   - (a,b,c), (e,f) 이렇게 연결성분은 2개가 있는 것이다.   - 가중치 그래프는 간선에 가중치가 부여된 그래프다. 2. 그래프 자료구조   - 그래프를 자료구조로 저장하기 위한 방법은 '인접행렬'과 '인접리스트' 두 가지가 있다.   - n개의 정점을 가진 그래프의 인접행렬은 2차원 nxn 배열로 저장한다.   - 인접행렬에서 정점 i와 j사이에 간선이 없으면 a[i][j]=0, 있으면 1로 표현한다.   - 인접리스트는 각 정점마다 한 개의 연결리스트를 이용해 인접한 각 정점을 노드에 저장한다. 그래프에 관한 간단하게 정리 해 보았다. 다음 DFS 공부하고 블로그를 남기도록 하겠다. 끝~!!

[자바 웹 프로그래밍]1장 첫번째 양파껍질 벗기기

자바 웹 프로그래밍 Next Step 책을 가지고 스터디를 시작했다. 1장은 학습 방향과 학습법에 관한 얘기인데, 나에게 와 닿은 부분을 남겨본다. 웹 개발자 공부 순서  웹을 처음 접했을 때 어디서부터 어느것 부터 공부해야하고 어떤 책을 봐야할지 매우 막막했던 기억이 있다. 본 책에서는 HTML --> CSS --> 자바스크립트 --> 자바 --> 자바웹프로그래밍 --> DB  이 순서로 학습 방향을 제시하고 있다. 백앤드 개발자로 가고 싶어 Spring 프로젝트를 몇차례 진행한 결론은 자바스크립트의 흐름은 어느정도 알고 있는게 도움이 된다는 결론이다.  다음으로 소프트웨어 학습하는 좋은 방법 몇가지가 나오는데, 그 중 내가 최근에 똑같이 느꼈던 것이 있어 적어본다. '일단 무엇인가 만들어보는 경험을 한 후 이론적인 개념을 학습하고, 다시 다음 단계 경험을 하고 이론적인 개념을 학습하는 과정을 반복하는 것이라 생각한다' 라는 구절이 나오는데, 최근 몇차례 Spring 프로젝트를 하면서, 이론에 대한 대략적인것을 기반으로 수많은 삽질과 성취를 이루고 난 다음, 삽질했던 부분을 책이나 인터넷 자료를 봤을때 부족했던 부분이 '아 이건 이렇게 쓰는거구나' 라는 것이 확실히 느낄 수 있었다. 전에는 무조건 '이론먼저 완벽하게 하고 프로젝트 하자!' 식이었는데 이는 경험상 별로 효과를 보지 못한것 같다(이론 금방 까먹는다.. 왜 써야 되는지 못느껴서). 책을 통한 학습  다음 몇가지 책을 추천했는데, 내가 읽은것과 앞으로 읽어봐야 할것을 나열하겠다. 1. 열혈강의 자바 웹 개발 워크북 - 엄진영  이 책 나에게 웹의 세계로 인도를 해주셧던 엄진영 강사님 책이다. 웹이 어떻게 나왔는지 부터 스트링 사용까지 차례대로 차근차근 따라할 수 있게 아주 잘 설명되고 좋은 소스코드를 제공하고 있다. 웹 처음이라면 반드시 볼것을 추천한다. 2. SQL 첫걸음 3. 코딩을 지탱하는 기술