window > show view > other > data source explorer 클릭
oracle 서버 선택 > thin 11 driver 선택 >> jar파일 바꿔주기
jar파일 불러오기: sqldeveloper-설치 폴더 > jdbc > lib > ojdbc7.jar선택
localhost:1xxx:xe로 바꾸고 > 핑테스트
1. 이를 위해선 사용자를 생성해야함.
cmd같은 sql에서의 command 툴인 : sqlplus에서..
CREATE USER (username)
IDENTIFIED BY (pwd)
DEFAULT TABLESPACE (테이블스페이스명)
TEMPORARY TABLESPACE TEMP;
//주의] 유저 ID는 대소문자 구분을 하지 않지만
패스워드는 대소문자를 구분함
2. 이후에 권한 설정 해줌.
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW,
CREATE SEQUENCE, CREATE PROCEDURE TO web;
(17.사용자관리.pdf 참고)
2019년 7월 1일 월요일
[공부요약] 07
################## Butter2
1. HTTP Verbs
http://bitly.kr/ewseYN
get과 post의 차이점.
get - 서버에게 resource를 보내달라고 요청할 때 사용합니다. 서버(혹은 DB)의 resource 는 클라이언트로 전달만 될 뿐 변경되지 않습니다.
참고로 웹브라우저 주소창에 주소를 입력하는 행위는 항상 get인식됩니다.
post - 서버에게 resource를 보내면서 해당 resource를 DB혹은 서버에 저장해달라고 요청할 때 사용합니다. ex) 회원가입, 사진업로드
put - 서버에게 resource의 업데이트를 요청할 때 사용됩니다.
2. REST
http://bitly.kr/TNw1lP
자원을 이름으로 구분하고 해당 자원의 상태를 주고 받는 모든 것이 REST라고 할 수 있지만, 일반적으로 REST라고 하면 좁은 의미로 HTTP를 통해 CRUD를 실행하는 API를 뜻합니다. RESTful은 REST의 비공식적 구현 가이드입니다.
3. 제너릭 타입
정의: 타입을 파라미터로 가지는 클레스와 인터페이스
선언시 클래스 또는 인터페이스 이름 뒤에 <> 붙임
ex) public class 클래스명<T>
ex) public interface 인터페이스명<T>
장점: 컴파일 단계에서 타입 에러 체크 가능.
List<String> list = new ArrayList<>();
class List<T>{
void add(T item){...};
}
4. 제너릭 메소드
정의: 매개변수 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드.
선언방법: 리턴 타입 앞에 <> 추가 하고 타입 파라미터 기술
타입 파라미터를 리턴 타입과 매개변수에 사용
ex) public <타입파라미터,...> 리턴타입 메소드명 (매개변수,...){...}
public <T> Box<T> boxing(T t) {...}
제너릭메소드 호출 2가지 방법:
5. 제너릭 제한
3가지 종류:
<?> : 모든 타입 가능
<? extends 상위타입 > : 최대 상위타입까지만 가능, 상위클래스 제한, ?는 여기가 한계야
< ? super 하위타입 > : 최소 하위타입까지만 가능, ?는 최소한 이정도는 되야지
쨋든 둘다 extends 부분은 포함한다...
6. 제너릭 상속
제네릭 타입을 부모 클래스로 사용할 경우
- 타입 파라미터는 자식 클래스에도 기술해야함!!
public class ChildProduct<T,M> extends Product<T,M>{...}
- 추가적인 타입 파라미터 가질 수 있음.
public class ChildProduct<T,M,C> extends Product<T,M>{...}
7.
[database-context.xml에서]
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="edu.iot.butter.dao" />
</bean>
의 의미.
basePackage 속성에 등록된 패키지 하위의 interface를 자동으로 Mapper로 인식하게 된다.
edu.iot.butter.dao에 있는 것을 매퍼를 스캔 후 매칭시켜가지고...
dao 인터페이스를 구현한 (dao's implementation)클래스를 자동 생성시켜준다.
즉, 원래는 dao 인터페이스를 implements해서 구현 클래스 만들어야함..
========================================================
기존 방법인 JDBC에선 connectionprovider써서
(...) PreparedStatement pstmt = conn.prepareStatement(sql); 써서 sql 처리.
rs.next() 등등
그 다음 방법인 Mybatis에선
sqlSession = ConnectionFactory.getSqlSession(); 로 세션 얻고, 세션 메소드로 sql 처리
(...)return sqlSession.selectOne(namespace + "getCount");
하지만 스프링은 인터페이스 dao를 구현한 클래스를 자동으로 만들어줌 . 간편하다.
( DB part4 >> contact2.pdf + Mybatis.pdf 참고)
===========================================================
근데 아마 구현클라스 자동으로 만들어주면서 내부적으로 @Repositroy까지 선언한것인듯? 그래서 서비스impl에서 dao에 @Autowired 걸수 있는것 같다.
-->
8. /* 인스턴스화 시키려면 @Service을 통해 빈으로 등록,
반면 MemberService는 인터페이스로써 인스턴스화될 수 없다. >> @Service안붙임
이름을 지정하지않으면 디폴트로 앞글자가 소문자인
클래스명으로 빈 이름이 세팅됨*/
@Service
public class MemberServiceImpl implements MemberService {}
9. @ResponseBody
리턴값을 뷰로 처리하지않고 그 자체가 응답으로 처리.제이슨 문자열로 바꿔서 리턴
10. GSON이나 Jackson 라이브러리가 설치되면,
@ResponseBody을 쓸수 있는데,
이 용도는 @ResponseBody 붙어있는 놈의 리턴타입은 뷰로 처리안하고
JSON문자열로 처리 후(라이브러리에서 내부적으로 toJSON(),fromJSON())
그것을 리턴해 준다.(src/test/java폴더 GsonTest.java참조 )
gson객체의 fromJson,toJson이용
11. @Transactional
12.@Intercepts
Mybatis interceptor 를 이용해서 쿼리로그를 디비에다 저장하기
:https://stove99.tistory.com/34
13. <bean> 선언 대략적인 구조
<bean id=" " class=" ">
<property name=" " value=" ">
<property name=" " ref =" ">
</bean>
14. $.get() == jQuery.get()
jQuery.get( url [, data ] [, success ] [, dataType ] )
Load data from the server using a HTTP GET request.15. [ BindingResult 결과 메시지 출력 ]
모델객체 VO에 @length,@NotEmpty등 조건 걸고 ,(hibernate이용)
스프링 단에선 객체 앞에 @Valid붙임.
그리고 모델객체 뒤 BindingResult 객체를 적어준다. (뒤에온다. 순서가 중요)
그리고 만약 뷰단에러가 있는 경우 폼에 에러 출력..
<form:errors path="userId" element="div" cssClass="error"/>
이 내용과 같게됨 == <div id="userId.errors" class="error">
결론: 폼 입력에서 에러난 경우, 윗놈이 화면에 <div>로써 생기게됨.
16. /*
에러가 났을경우 이 페이지를 보여줘라. => @ExceptionHandler등록
에러를 처리할 놈들을 등록한다. 여러개면 배열형식으로{,} 작성..
에러 정보를 담으려면 메소드의 매개변수를 가지면 된다.
이를 통해 try~catch를 소스에서 뺄 수 있다.
단, json응답만 제외.뷰로 이동할 필요가 없다.
*/
@ExceptionHandler({SQLException.class,DataAccessException.class})
public String handlerError() {
return "error/database_error";
}
17.
SLF4J를 사용해야 하는 이유
느슨한 결합을 위해 즉, 특정 라이브러리에 종속되는것을 피하기 위해.
Log들의 인터페이스 같은 역할을 하는 SLF4J를 사용한다.
################## Butter3
1. @Valid
1. Error 인터페이스와 BindingResult 인터페이스
https://bbiyakbbiyak.tistory.com/3
BindingResult = 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러 코드로부터 에러 메시지를 가져옴
2. log4j 설정
Appender & Logger 란?
https://addio3305.tistory.com/43
* log4j의 3요소: Logger, Appender, Layout
Logger: 메시지를 Appender에 '전달'한다.
Appender: '어디'에 출력할지 결정한다.(콘솔,파일,DB), 어디다 붙일꺼여?!
Layout: '어떤' 형식으로 출력할지 결정한다.
3. RedirectAttributes
Redirect되는 페이지에 모델을 전달하는 용도
문제상황: 리다이렉트 방식이 GET 방식 이라 데이터 전송에는 적절하지 않다
방법: 모든 플래시 속성을 세션에 복사한다. 이후 세션에서 모델로 이동시킨다.
http://bitly.kr/B8YMJj
1. @Valid
- @Valid선언된객체에 설정을 바탕으로 검사후 BindingResult에 담아준다.
- 에러를 발생하려면 FieldError객체를 만들어서 BindingResult에 넣어준다.
1. Error 인터페이스와 BindingResult 인터페이스
https://bbiyakbbiyak.tistory.com/3
BindingResult = 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러 코드로부터 에러 메시지를 가져옴
2. log4j 설정
Appender & Logger 란?
https://addio3305.tistory.com/43
* log4j의 3요소: Logger, Appender, Layout
Logger: 메시지를 Appender에 '전달'한다.
Appender: '어디'에 출력할지 결정한다.(콘솔,파일,DB), 어디다 붙일꺼여?!
Layout: '어떤' 형식으로 출력할지 결정한다.
3. RedirectAttributes
Redirect되는 페이지에 모델을 전달하는 용도
문제상황: 리다이렉트 방식이 GET 방식 이라 데이터 전송에는 적절하지 않다
방법: 모든 플래시 속성을 세션에 복사한다. 이후 세션에서 모델로 이동시킨다.
http://bitly.kr/B8YMJj
4. <input type="hidden">
사용자가 입력하거나 선택하는 정보는 아니지만 폼 전송이 같이 전송해줘야 하는 정보를 담기 위해서 히든 필드(Hidden Field)를 사용합니다.
예를들어서 회원가입시 사용자의 아이피를 받는 경우 히든필드에 넣어서 폼 전송시 함께 전송합니다.
사용자가 입력하거나 선택하는 정보는 아니지만 폼 전송이 같이 전송해줘야 하는 정보를 담기 위해서 히든 필드(Hidden Field)를 사용합니다.
예를들어서 회원가입시 사용자의 아이피를 받는 경우 히든필드에 넣어서 폼 전송시 함께 전송합니다.
<form:hidden path="userId"/>
<!--설명: hibernate로 모델객체에 에러메시지 지정했기때문에, 폼 입력으로전달될때,
고치진 않아도 어쨋든 히든형태라도 데이터를 가지고 있어야한다. 따라서 히든 처리해준것! -->
5. filter와 Interceptor의 차이
: 클라이언트 <-> 디스페처서블릿 & 디스페처서블릿 <-> 컨트롤러 (즉, 시점차이)
https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
(필터 사용 예제는 "2.JSP 프로젝트" 폴더에 있음!)
6. BindResult의 reject 메소드
<!-- 전역 에러 처리-->
<form:errors cssClass="error" element="div"/>
=> <div id="member.errors" class="error">비밀번호가 일치하지 않습니다~~</div>
로 변경됨!!!
<!-- 설명: 에러시 백단의 result.reject("updateFail","비밀번호가 일치하지 않습니다~~"); 가 실행 되며 뷰에서 "비밀번호가 일치하지 않습니다~~" 의 에러 메시지를 띄운다.
7.
in 서비스단
public Member checkLogin(Login login) throws Exception {
Member member =dao.selectOne(login.getUserId());
(...)
throw new LoginFailException("사용자 ID 또는 비밀번호가 일치하지 않습니다.");
}
in Account 컨트롤러 단
@ExceptionHandler(LoginFailException.class)
public String handlerLoginError(HttpServletRequest request, Exception e) {
log.debug("============= handlerLoginError ===========");
log.debug("============= Exception 잡았다");
request.setAttribute("login", new Login());
request.setAttribute("error", e.getMessage());
return "account/login";
}
8. preventDefault 메소드
$(...).submit( function(e){
e.preventDefault()
};
https://programmingsummaries.tistory.com/313
9. invalidate() 메소드
사용법: session.invalidate();
session은 HttpSession객체임.
역할: 로그아웃 시. 세션 종료.
10. 자바의 '자료형'
- primitive 형
- reference 형
데이터 타입이랑 헷갈리지마라.
11. 추상클래스와 인터페이스의 차이점.
추상클래스는 상속받아서 기능을 이용하고 확장하는 개념.
인터페이스는 구현객체의 같은 동작을 보장하기 위함.
이런 메소드를 만들겠다 알려주는 명세서이다.(껍대기),
구현을 강제하기 위함
추상클래스는 abstract 메소드와 일반 메소드가 함께 있을 수 있지만
인터페이스는 모든 메소드가 abstact 메소드. 명세서이기 때문. (틀만 생성)
그럼, 비슷비슷한대 인터페이스 쓰는 이유는? 자바가 다중상속을 지원하지 않기때문
https://marobiana.tistory.com/58
https://brunch.co.kr/@kd4/6
12. AOP 란?
pdf 참조
13. String과 StringBuffer의 차이점. & StringBuffer와 StringBuilder의 차이점
: string은 불변객체로써, 연산시 매번 객체를 생성하기 때문에 느리다.(예: + 연산)
단 데이터 조회시에는 빠르다. StringBuffer는 변하는 객체기 때문에 스트링연산이 빠르다.
14. String은 불변객체다. 인스턴스가 생성되고 메모리가 힙에 할당됨.
String에 대해 연산을 해도 메모리의 값이 절대 변하지 않는다.
만일 String 연산시, 새로운 인스턴스를 만들고 다른곳에 메모리를 할당한다.
기본적인 예제)
String s1 = new String("abc");
String s2 = new String("abc"); 일 경우 각각 다른 주소로 힙 메모리가 할당된다.
하지만 예외 경우 있다.
String s3 = "abc" String s4="abc" 가 리터럴로 선언됐다면, 힙메모리 안에 String Costant Pool 이라는 별도 공간에 "abc"가 들어간다. 즉, 리터럴로 같은 문자열로 선언된경우는 SPC내 같은 메모리를 참조한다.
결론적으로 s1 != s2 이고 s3==s4 이다.
15. 오버라이딩 vs 오버로딩
오버라이딩 : 부모의 메소드를 자식에서 재정의 할때
오버로딩: 메소드명이 같은 경우 매개변수 (데이터 타입,개수)이 다르다면 사용가능
리턴형은 오버로딩과 상관 없음.
16. 자바 접근제한자
https://blog.naver.com/pjok1122/221500736523
같은 패키지이냐 다른(외부) 패키지냐로 우선 구분.
public: 외부 모든 클래스에서 접근가능
protected: 외부 패키지여도 상속받은경우 접근가능
(default) : 같은 패키지에 있는 클래스에서 접근가능
private : 같은 클래스 내에서만
17. UNION과 UNION ALL 의 차이점
https://20140501.tistory.com/63
18. TRUNCATE 와 DELETE의 차이점
공통점 : 해당 테이블의 모든 데이터를 삭제하는 명령어
차이점: 기능적으로 같음 그러나 구조적 차이
DELETE는 DML로서 ROLLBACK가능
TRUNCATE는 DDL로서 ROLLBACK 불가, 대신 빠름.https://20140501.tistory.com/59?category=426323
19. [Jquery]
serialize() : form 의 객체들을 텍스트화 하고 그 결과를 return 합니다.
형식은 inputName=inputValue&inputName2=inputValue2 입니다.
serializeArray() : Json문자열 형태의 배열을 return
형식은 [{name:"name",valeu:"valeu"},{name:"name2",value:"value2"}] 입니다.
http://bitly.kr/psCAu6
20. CDATA 사용이유
: CDATA 안에 들어가는 문장을 문자열로 인식하게 합니다.
https://javacpro.tistory.com/5
21.입력폼(form) 과 스프링 form 태그
https://araikuma.tistory.com/75
https://giyatto.tistory.com/70
22. [DB] ROW_NUMBER( ) VS RANK() 차이점
사용법:
차이:
ㅈ소 폴더 참조
23. JSP directive == <%@
종류 3가지:
page : <%@ page = "contentType= html/text" %>
include : <%@ include file=" xxx.jsp" %>
taglib : < %@ taglib prefix="c", uri=" " %>
동작 : 전체구조에 대해 WAS에 지시를 내린다.
24. Ajax와 동일한 효과를 가지면서도 동일출처원칙을 회피할 수 있는 것,
이것이 JSONP가 가진 효용성. 하지만 GET방식으로만 호출 가능하다는게 한계.
25. @Autowired
http://bitly.kr/9a4aNN
26. DI (의존성 주입)
의존객체를 생성하는게 아니라, 전달 받음.
- 스프링은 객체를 직접 생성하고 초기화 할 필요없이, GenericXmlApplicationContext클래스를 통해 XML 파일로부터 읽어와 객체 생성과 초기화를 할 수 있다.
- 스프링이 생성하는 객체를 Bean객체라고 부른다. 객체정보를 <bean>이 담고 있다.
- <property> 태그를 처리할 때, name속성의 값 첫글자를 대문자로 변환한뒤 일치하는 set메서드를 사용한다.(= 초기화)
https://m.blog.naver.com/sksk3479/221173670110
+ (spring_chapter1 과 함께 볼것!)
27. Reflection
객체로 클래스 정보를 분석해 내는것.
자바의 동적바인딩을 가능케함.
원래 자바에서는 동적으로 객체를 생성하는 기술이 없었다.
-> 동적으로 인스턴스를 생성하는 Reflection으로 그 역할을 대신하게 된다.
https://asfirstalways.tistory.com/221
28. 조립기
https://m.blog.naver.com/sksk3479/221177485649
2
쓰는이유: 저장 객체를 출력 할때 스크립팅을 전혀 쓰지 않는 기술
EL의 내장객체 종류:
http://bitly.kr/FMEqm6
30. JSTL
https://blog.naver.com/darae9108/220772043379
공부6의 ####7 spring전까지 복습함
피드 구독하기:
글 (Atom)