7월, 2018의 게시물 표시

DAO를 Inject했는데 DAOImpl이 동작? DAO/Service 계층 분리이유?

어떻게 DAO를 주입했는데 DAO Impl이 돌아갈까? - DAO를 주입한게 아니라 DAO타입의 객체를 주입한 것. - 스프링에 persistence패키지를 스캔대상으로 등록. - 이 때 @Repository가 붙은 DAOImpl을 스프링이 스캐닝하고, DAOImpl이 Bean으로 등록된다. DAO / SERVICE 계층 나누는 이유? - DAO는 그 자체만으로도 DB에 접근할 수 있게 해주는 계층이다. - 따라서 어떤 DB건 DAO를 통해 DB에 접근할 수 있다. - 그리고 Service는 직접 DB에 접근하는 권한이나 역할이 없으며, DAO로 데이터를 전달하거나 DAO로부터 받은 데이터를 가지고 작업을 한다. - 보안관련문제도 있다. Service계층은 직접 DB 정보를 가지고 있지 않기 때문에 보안에 좀 더 유리하다.

얄팍한 스프링 (@Component와 @Bean은 언제?)

@Component @Component는 component scanning과 자동 의존관계 설정에 유용함. 클래스에 @Component만 달아놓으면 스프링이 스캐닝 해주니까 (<- 이거 True? 실제로 안 해봄. 느낌임;) 그럼 @Bean은 언제 쓰지? 가끔씩 자동 의존관계 설정이 어려울 때가 있음. 예를들면 써드파티가 라이브러리를 제공한다 했을 때 우리는 써드파티의 소스코드까지 까볼 수 없다. 따라서 클래스에 @Component 어노테이션을 쓸 수 없음... 이런 경우엔 @Bean을 활용한다. @Bean은 스프링이 root context에 등록해야하는 빈으로 등록하는 객체를 반환한다. @Bean이 붙은 메소드는 instance 생성에 책임이 있음.

얄팍한 암호화 (다이제스트, 해쉬함수, 스트레칭, 솔트)

암호화의 기본은 단방향. 해쉬함수 유저가 입력한 패스워드가 1234면 해쉬함수라는 녀석은 이 간단한 패스워드 1234를 복잡한 코드(2j1hd1i2keauiaeh24i1h293192492) 로 바꾸어 줌. 다이제스트 해쉬함수를 돌려서 나온 복잡한 코드가 바로 다이제스트. 솔트 해쉬함수를 돌릴 때 고객이 입력한 1234 뿐만 아니라 양념을 더 쳐서 패스워드를 길게 만든 후 (1234+229dfendi2jfj) 다이제스트를 만들기도 하는데, 이 때 양념을 치는게 솔트. 스트레치 다이제스트가 나온 후 수십 수백번을 또 해쉬함수로 돌려가지고 다이제스트를 복잡하게 하면 스트레치.

얄팍한 RESTful

RESTful이란? <8줄 요약> HTTP 프로토콜을 이용하는 자원지향 구조. URI는 자원을 대변하며, 클라이언트가 보낸 HTTP 프로토콜에 따라 그 자원을 어떻게 할지를 정한다. 그래서, 모두 같은 URI이어도 클라이언트가 보내는 요청에 따라 행하는 것이 다르다. 자원은 모두 URI로 표현이 되어야 하고 하나의 자원은 그 자원과 연관 된 자원들 또한 표현하는 것이 권장된다. 서버나 클라가 어떤 상태인지는 관심 없고 오는 메시지를 그냥 처리하기만 한다. 쿠키는 사용할 수 있다. <4줄 요약> URI는 자원을 대변하며 HTTP프로토콜에 따라 그 자원에 대한 조작을 어떻게 할 것인지 정의한다. 모든 요청은 일회성이고, 서버는 클라이언트의 요청에 따른 메시지를 처리하기만 하며 상태를 검증하지 않는다. <1줄 요약> 자원(리소스, 데이터)을 대변하는 URI에 클라이언트가 어떤 행동을 할지 정해서 서버로 알려주면, 서버는 다른 것들은 생각 않고 그냥 그 메시지를 처리하기만 하는 구조.

[Spring] @ModelAttribute

Model은 컨트롤러가 클라이언트로부터 데이터를 받거나, 컨트롤러가 클라이언트로 데이터를 되돌려줄 때 사용하는 객체다. @ModelAttribute는 메소드 안에 정의한 파라미터 타입의 인스턴스에 클라이언트가 보낸 데이터를 Mapping 시켜주는 역할을 한다. 받을 때도 쓰고 되돌려 줄때도 쓴다. 그리고 뒤에 이름을 붙여주면 ex) @ModelAttribute("이름") 클라이언트로 되돌려주는 모델맵에 key값이 이름이 된다. 따라서 클라이언트에서는 (이름.프로퍼티)로 값 출력이 가능하다. 혹은 앞글자가 소문자인 클래스명으로도 가능하다. 그래서 @ModelAttribute("이름") Class method 라면, 클라이언트에서는 ${class.name} 이랑 ${이름.name} 모두 같은 값을 출력한다.

얄팍한 토비 스프링 공부 - Configuration / Bean, IOC, DI

IOC - 제어의 역행 1줄 요약: "어플리케이션에서 사용하는 객체를 개발자가 정하는 것이 아니고 외부의 사용자가 정하게 하는 것" '제어의 역행'이라니!! 한국어로 번역하면 너무나 어려운 용어가 된다. 쉽게 말하자면 각 객체들이 자신들의 로직을 수행할 때 필요한 것들을 직접 호출하거나 상속해서 쓰는게 아니고 중간자적인 존재 하나가 필요한 것들을 계속해서 공급해주는 것이다. 보통은 자신들이 능동적으로 필요한 오브젝트, 메소드, 파라미터를 호출하는데 반해 IOC가 되는 경우엔 필요로 하는 것들이 "지급"된다. 그리고 바로 이 "지급"이라는 것이 무엇이냐? DI가 되겠다. DI - 의존관계설정 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다. 런타임 시점의 의존관계가 클래스모델이나 코드에는 드러나지 않는다. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다. (From 토비 스프링) 의존성 주입이라고 많이 번역이 되는데.. 엄밀히 말하면 객체에 다른 객체가 포함되는 것이 아니라 참조값만 불러오는 것이기 때문에 의존관계설정이 더 정확한 표현이라 한다. 위의 IOC에서 이야기한 중간자적인 존재가 "지급"하는 대상이 DI 오브젝트들이다. IOC가 필요한 것들을 지급해주는 것이라면, DI는 바로 쥐어지는 객체(Bean)이라고 생각하자. 이 쯤되면 대충 감이 올텐데 여기서 말한 '중간자적인 존재'란? 바로 Spring이 되겠다. 예시) 내가 적군을 물리치러 전쟁에 나갔다. 옆에는 간달프가 있다. 간달프는 전쟁에 직접 참여하지 않지만 날 도와준다. 내가 수상전을 치를 때는 수상전에 유리한 석궁을, 내가 지상전을 치를 때는 지상전에 유리한 창을 쥐어준다. 나는 무기를 고르거나 준비할 필요가 없다. 필요한건 상황에 맞게 간달프가 나에게 주고 있다. - 여기서 '나...

[Spring] 프로젝트 설정방법 요약본

1. 라이브러리 다운로드 및 버전 설정 - 프로젝트를 생성하면 존재하는 pom.xml 파일을 통해 스프링 버전을 설정해준다, - 기본적으로 필요한 라이브러리를 다운받고 버전을 설정한다. - 아주 기본적인 라이브러리 : spring jdbc / spring mybatis / mysql /spring test / log4jdbc - 버전 설정 대상 : Spring (Original = 3.1.1) , JUnit (4.7 -> 4.12로) , Servlet (2.5에서 3.1.0으로) - Build Configuration - Project Facet - Java version을 1.8로 변경 (기존 1.6) * 최초 설정시 mysql 인코딩도 반드시 utf-8으로 변경해주자 * mysql의 characterset utf8 확인 * 일반적으로 C:\ProgramData\MySQL\MySQL Server 경로 내 my.ini 파일을 열고 charset을 utf-8로 바꿔주면 DB 문자열 기본값이 utf-8로 변경된다. 2. DI 등록 - DB 커넥션풀 설정을 위해 root-context에 dataSource, sqlSessionFactory, sqlSession을 각각 Bean으로 등록한다. - 만약 쿼리문과 쿼리 결과를 로깅하기 위해 log4jdbc라이브러리를 사용하면 class가 변경되므로 이 때 class 경로는 search할 것! 3. DAO - Mapper - DAOImpl 정의 - DB에 연동해서 작업이 필요한 경우 진행한다. - CRUD 메소드를 멤버로 가지고 있는 DAO 인터페이스를 생성한다. - xmlMapper를 생성하고 DTD를 추가한다. - 이 후 실제 db에서 실행할 query를 작성한다. 각 query별로 id와 resultType을 같이 지정한다. - id는 DAO인터페이스에서 정의한 메소드명과 일치시키는 것이 좋다. - DAOImpl은 DAO 인터페이스를 구현하는 클래스로, 각 메소드들은 M...

[Spring] 페이징처리 / 검색기능 구현 흐름

페이징 처리는 아래와 같은 단계로 진행하면 좋다. 1. URI 문자열을 조절해서 원하는 페이지의 데이터가 출력되도록 하는 단계 2. 목록페이지 하단에 페이지 번호를 보여주고 클릭하면 페이지가 이동하는 단계 3. 목록페이지에서 조회나 수정작업을 한 후 다시 원래 목록페이지로 이동할 수 있게 처리하는 단계 1. URI 문자열을 조절해서 원하는 페이지의 데이터가 출력되도록 하는 단계 리스트가 노출되는 URI에 get 방식의 인자를 전달한다. (board?page=1) 자바빈으로 컨트롤러에서 클라이언트가 보낸 파라미터를 수집 클라이언트가 보낸 파라미터를 가진 객체를 Service 메소드의 파라미터로 포워드 DAO에선 (정확히 말하면 mapper에선) 쿼리 내 변수명과 같은 자바빈의 멤버를 파싱 페이징 처리는 각 링크에 현재 페이지 번호와 perPageNum등 현재 상태 정보를 가진 객체를 서버로 같이 보낸다. 서버로 전달 된 파라미터들은 스프링 프레임워크의 수집 기능에 의해 분석되고 각 파라미터들은 서버에 전달되는 데이터로 탈바꿈한다. DAO, MyBatis xmlMapper, DAOImpl을 통해 페이징 처리 SQL문을 작성해둔다 - 조회할 게시물의 번호 / 게시물 확인 전에 탐색 중이던 페이지 번호 / 페이지 당 노출하는 게시물 수 클라이언트(웹)에서는 위 내용(페이지, 페이지번호, 페이지당 게시물 수)을 서버로 원하는 방식대로 보낼 수 있다 (Form태그 내 hidden Input / Javascript / get방식으로 URL에 포함) 서버에서는 이 내용들을 각각 받기보단, 하나의 클래스를 정의하고 그 클래스 안에 클라이언트(웹이) 보낸 정보들을 멤버로 정의해둔다 - 이 때 주의할 점은 xmlMapper에 정의해놓은 SQL문이 수집하는 파라미터명과 클래스 멤버의 이름이 동일해야 한다는 것이다. - xmlMapper에서 #{page}라는 가변 파라미터를 정의해두었다면, 반드시 클래스 안에 멤버 속성 이름은 반드시 pa...

[독서] Switch

목적지가 명확한 그림엽서 빠져나갈 궁지가 없는 구체적인 행동방식 (흑백목표 + 장기적 비전) 보고, 느끼고, 변화하게