Broken pip 대처법


문제 Problems

Ubuntu에서 작업을 하다보면, pip 실행시 아래와 같이 에러 메세지가 나오는 경우가 있다.

Errors were encountered while processing:  python3.5  python3  dh-python 에러나
dpkg: error processing package dh-python (--configure):
dependency problems - leaving unconfigured
Errors were encountered while processing:
python3.5
python3
dh-python

Fatal Python error: Py_Initialize: Unable to get the locale encoding 에러
Could not find platform independent libraries <prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

Current thread 0x00007f18d2e52700 (most recent call first):
Aborted
dpkg: error processing package python3.5 (--configure):
subprocess installed post-installation script returned error exit status 134
dpkg: dependency problems prevent configuration of python3:
python3 depends on python3.5 (>= 3.5.1-2~); however:
  Package python3.5 is not configured yet.

해결책 Solution

이 경우, pip를 재설치하고 환경변수를 잡으면 대부분 해결된다. 하지만 그래도 안될 경우에 아래의 명령어로 ubuntu 16.04 버전의 기본 python과 이에 따르는 dependent libraries를 다시 설치해주면 해결된다. 

$ sudo -i

$ for pkg in $(dpkg --get-selections | egrep -v 'deinstall' | egrep python | awk '{print $1}'); do  apt-get -y --force-yes install --reinstall $pkg ; done


JSON이란 무엇일까?

 

JSON은 JavaScript Object Notation으로 데이터 교환포맷의 일종이다.

XML에 비해 경량화된 데이터 교환포맷으로 기존 XML이 상당히 무거운데 그 점을 보완할 수 있는 것이 JSON이다.

Ajax로 서버와 통신하며 데이터를 주고 받을 때 데이터 교환을 쉽게 하기 위해 JSON을 사용한다.

 

주고 받을 수 있는 자료형은 숫자, 문자열, boolean, 배열, 객체이며

기본 데이터 배열은 KEY와 VALUE로 구성되어 있으며 중괄호로 감싼다.

KEY값은 문자열이기 때문에 반드시 "KEYNAME" 이렇게 쌍따옴표를 붙여줘야 하고

VALUE에는 기본 자료형이나 배열, 객체를 넣으면 된다.

 

JSON의 기본표현 형태



{

    "age": 29,

    "name": "HIKI",

    "family": {"father": "홍길동", "mother": "심청이"}

}


1. AJAX(Asynchronous Javascript and XML)란 무엇인가?

 

Ajax의 예를들면,

네이버나 다음같은 포털사이트에 가보면,

메인페이지에서 뉴스 등 밑에 < , > 요런 버튼을 눌렀을 때 페이지가 Reloading 되지 않고 뜨는걸 볼 수있다.

 

보통 웹의 흐름에서는 새로운 URL로 호출 되면서 페이지가 새로 뿌려지지만,

AJAX를 사용하면 일부만을 로드해올 수 있는 것이다.

이름처럼 비동기 통신을 통해서.

 

2. 어떤 원리이고 흐름인가?

 

보통 웹사이트 들어갈 때 어떻게 들어가는가?

브라우저 위에 주소창에 URL을 쓰고 들어간다. 그러면 브라우저가 그 URL(서버)로 연결시켜준다.

서버에서 받아온 데이터들을 브라우저가 받아서 파싱해서 뿌려준다.

 

이게 보통 웹의 흐름이라면,

 

AJAX는 AJAX 자체가 브라우저라고 생각하면 된다.

URL을 받고, AJAX 내부에서 XMLHttpRequest 통신을 해서 URL(서버)로 연결시켜준다.

서버에서 받아온 데이터들을 AJAX가 받는다.  (어떻게 뿌릴지는 여기서 직접 알아서 한다 ㅋㅋ)

 

3. 예제

 

jQuery 같은 프레임워크를 안쓰고 AJAX 통신 하는 예제는

http://mainia.tistory.com/314  <- 이 블로그 참조

 

jQuery를 이용하면 간단 명료하게 작성 가능하다.

 


<script  src="http://code.jquery.com/jquery-latest.min.js"></script>;;

<script>

$(document).ready(function() {

     jQuery.ajax({

           type:"GET",

           url:"/test",

           dataType:"JSON", // 옵션이므로 JSON으로 받을게 아니면 안써도 됨

           success : function(data) {

                 // 통신이 성공적으로 이루어졌을 때 이 함수를 타게 된다.

                 // TODO

           },

           complete : function(data) {

                 // 통신이 실패했어도 완료가 되었을 때 이 함수를 타게 된다.

                 // TODO

           },

           error : function(xhr, status, error) {

                 alert("에러발생");

           }

     });

});

</script>


 


* <script  src="http://code.jquery.com/jquery-latest.min.js"></script>;;

이렇게 쓰면 jQuery의 항상 최신 버전을 쓸 수 있다.

 

 

보통 complete을 쓸 지, success를 쓸 지는 상황에 따라 다르다.

둘 중 하나만 써야함. 그냥 설명하기 위해 2개 쓴 것임.

(반드시 둘 중 하나만 써야하는건 아니고, 둘다 쓰면 두 번 호출되기 때문에)

 

 

 

 

 

4. 값 받아오기

 

success를 통해 받아온 값을 alert 으로 띄운다거나,

HTML 코드에 추가해서 나타내거나 여러가지 방법으로 보여지도록 할 수 있다.

 

JSON으로 받는 법을 정리하겠다

 

 

JSON 객체는 요렇게 생긴 객체임.

 


{"name": "lioncat", "age": 14, "nickname": "qwerty"}

 

 

서버 단에서는,

객체에 있는 값을 JSON 형태로 만들어주는 라이브러리들이 있으니

서버는 그 것을 사용해서 JSON으로 리턴 하면된다.

 

클라이언트에서도 JSON으로 받아야 하는데,

3번 예제처럼 dataType:"JSON" 부분을 써주면 JSON으로 받아진다.

 

 

 

success에서 받아온 객체인 data를 alert으로 띄워보면

[Object object] 라고 나올 것이다.

 

저것을 어떻게 보느냐???

-> each 함수를 사용해야 된다.    (자세한 each 사용법은 검색 ㄱㄱ)

 


// success나 complete 안에서 사용

$.each(data, function() {

     alert(this["name"]);

     alert(this.age);

});


 

또는



$.each(data, function(index, entry) {

     alert(entry["name"]);

     alert(entry.age);

});



 

* 참고로 jQuery를 사용하지 않은 순수 AJAX를 통해 데이터를 받아왔을 때는 eval 함수를 써야한다.

jQuery의 AJAX에서는 자체적으로 JSON Object로 변환 시켜준 것이기 때문에 each로 쓸 수 있지만,

순수 AJAX에서는 JSON 객체로 변환되지 않았기 때문이다.

 

 



Java 자바 프로그래밍: Spring, Mybatis vs JPA vs Hibernate

 
다음주에는 오전수업 스프링. 그 이후에는 자바스크립트.
요즘은 함수식 언어가 대세가 될 것 같아요. From 어제 컨퍼런스 임백준씨 발언.
My Batis는 제가 봐온 라이브러리 중에 제일 단순한 녀석이에요.
자바의 객체 지향 설계를 보면 테이블과 굉장히 유사해요.
2000년대 초반에는 객체지향 언어가 유행했죠. 모듈화 라던가 분업. 역할분배. 구성. 이런 것들에 대한 장점이 있었죠. DB가 되면서 DAO라는 패턴이 나오기 시작했죠.
RDBMS과 OOP가 관계가 많더라.
 -> SQL지상주의(DBA, Legacy 기존시스템)
  라이브러리를 사용해서 SQL를 좀 쉽게 객체화 시켜 쓰자!
 -> 새로운 방식
객체를 아예 관계 DB Object Relational Mapping 하자! 라는 말도 안되는 이야기가 있었죠. ORM 실패했습니다. 이게 되려면 DB와 객체지향 설계가 완벽했다는 이야기가 전제되어 있어요. 한국은 SQL의존도가 심했기에 망했죠. 미국, 호주에서는 꽤 흥했어요. Hibernate라는게 있었죠. 아무튼 우리나라에서는 SQL을 그대로 두고 그 결과를 가지고 SQL Mapping을 하기 시작했어요. iBatis가 나왔죠. Ver 2.x까지는 성공을 거두죠.
Mybatis vs JPA vs Hibernate 한국에서만 Mybatis를 사용하고 전 세계적으로는 아니죠.
.jsp 파일에서 #{title} -> getTitle() 과 같다.  이게 기능의 전부에요.
Mybatis를 프레임워크라고 생각하지 않아요. 확장을 할 수 없기 때문이죠.
꽤 성공적인 프로젝트였어요.
iBatis -> XML기반.
설정파일. Config 파일. SQL(매핑파일)
log4j.properties과 mybatisConfig.xml 파일은 Java -> src 폴더에 넣으시면 되고요.
mybatisConfig.xml 부분의 <mappers></mappers>부분 삭제
JDBC .jar파일 설정 할 것.

  • Mybatis 사용방법 3가지.
XML 만 사용하는 방식 = ibatis 방식
인터페이스의 Annotation 방식 = Mybatis 방식
두 가지를 혼용하는 방법. <- 강사님이 선호하는 방식.
 
TimeTest.java
SqlSessionFactoryBuilder ()
// 오늘은 Mybatis를 활용해서 오늘 날짜를 가져와 볼 거에요.
Mybatis는 단점이 하나 있죠. Mapper 파일이 없으면 동작을 할 수 없습니다. 넣어주고 시작.
Src -> 패키지 생성 -> new -> others -> xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="org.thinker.time.TimeMapper">
<select id = "getTime">
select sysdate from dual
</select>
</mapper>
설정파일이 로딩 될 때, xml파일이 로딩되도록 해야 해요.
사용자 가이드를 보면,
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
여기에서 resultType="Blog"는 무엇일까?
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
하지만, 여기에서 TimeMapper.xml 파일에 문제가 생기면 모든게 안돌아가는 사태가 발생해요.
때문에 Mybatis에서는 초미세 작업단위로 접근하는게 필요해요.
 
// 숙제: Mybatis안에 if, for루프, 다이나믹 SQL에 대해 조사해 올 것.
스프링, ajax, 자바스크립트.
XML 방식을 쓰면, 파라미터 타입, 리턴 타입을 결정해줘야한다. Annotation 방식을 쓰면, 그런 불편한 점이 없어지죠.
간단한 쿼리문은 Annotation 방식이 편하고 복잡한 건, XML방식이 더 편하다.
두 가지 같이 쓸 수 있으면 Best
! XML에 있는 namespace값과 인터페이스의 패키지 명이랑 풀네임이 같으면 resource로 주지 않아도 먹힌다 !
Primary key와 VO는 제네릭을 사용할 수 있지 않을까요? 이렇게 해서 한 번 지정해서 쓸 수 있도록 하면, 공통적으로 전부 써먹을 수 있지 않을까요? XML 기준으로
Static block 이라는 걸로 try ~ with 구분을 넣어준다. Static block은 한 번만 불러온다.
게시판과 회원을 만들 때, 달라지는 것은 Mapper이름뿐이 아닐까요? 생성자로 Mapper 이름 받아오게.
이거 만들어 쓰는게 오늘의 키포인트. 여기까지 하면 제네릭 DAO를 만들어 낼 수 있겠죠.
그럼 제네릭 컨트롤러나 서비스를 만드는게 가능할 까요?
중요한 건 매뉴얼에 있는 내용이 아니라 Mybatis 블로그에 있는 내용이 중요.
// 팀별로 제네릭 DAO를 세팅하고 사용하는 방법을 익히실 것.
 
 
 
 
Java 자바 프로그래밍: Spring, CRUD

 
화면에 다 뿌릴 필요가 있었을까. 오라클을 이용하면 그럴 필요가 없었겠죠. 제로보드라고 하죠.
URL 페이지 번호에 음수를 넣으면 쿼리문이 다 나오는 에러가 발생.
쿼리문 날리는 부분에서 좀 더 보완을 할 수 있어요.
한 페이지에 10개, 10페이지 출력 (100개의 게시물 찾는 쿼리문)
101개의 게시물이 있으면 ">>" 다음 페이지 리스트 출력.
 
select
 rn, bbsno, title, writer, regdate, cnt
from
(
select /*+INDEX_DESC(tbl_mp3, pk_mp3) */
 bbsno, title, writer, regdate,
 count(bbsno) over()
from tbl_bbs
where bbsno > 0
and rownum <= (CEIL((page / 10))*100)+1)
)
rn> ((2-1)*10) and rn <=(2*10);
Count() over() 의 사용. 내부에서 집합함수 다시 사용한 것.
원글 데이터 뿐만 아니라 게시글에 필요한 숫자까지 한 번에 가져온 것.
내부적으로 Count (StopKey)가 들어가기 때문에 숫자 세는 것까지 들어간다.
요즘 나오는 게시판들은 맨 마지막으로 가는 버튼을 사용하지 않는다. (느려지기 때문에)
VO에 항목이 새로 생기면, VO를 새로 만들지 않고, 상속을 사용해서 추가하는 방법이 있다.
데이터 베이스에서 속도가 느려지는 부분은 검색이에요.
 
보니까 페이지 번호를 무는 게 어려운 경우가 많은 것 같아요.
일단은, 현재페이지(2)가 필요해요.
카운트(101)
라인 디스플레이(10)
페이지당 사이즈(게시물의 개수) (10)
위의 쿼리문에서 100+1 부분은
라인 디스플레이 * 페이지당 사이즈
 
-- 강사님 코딩 부분
PageMaker 유틸부터 제작. 변수 선언하고, 생성자 작성. 생성자를 오버로딩으로 3가지 경우를 작성. 파라미터 0~2개인 경우. Getter, setter, toString. 제작. 생성자 호출하기 전에는 다른걸 호출하지 못한다. 문자열 던져서 숫자로 바꾸어주는 static 메소드 선언.
 
서블릿-> Controller 생성.
 
<필기그림1>

 
<ul>과 <li> 태그 사용해서 리스트 .jsp파일에서 작성. 최대한 UI는 바보스럽게 코딩 해줘야 해.
Hasnext와 hasprev를 계속 만들어 내는 이유는 같은 리스트에서 계속 쓰기 위해서.
 
이번 시간에 했던 부분.
  • 가능하면, 테이블 스캔을 어려 번 쓰지 마라.
  • 자바의 객체를 써먹어라. UI를 최대한 바보스럽게 코딩해라. 
 
검색어를 입력해서 검색을 했을 때, 여러 페이지가 나올 수 있다. 이  때, 페이지 전환은 검색 조건을 유지한 상태로 넘어가야 하는 문제가 발생한다. 이 때는, <a> 태그의 링크가 엄청 복잡해 질 수 밖에 없다. 때문에 검색조건 필터링을 하는 사이트(예. 다나와)에서는 이를 컨트롤하는 것이 어려울 수 있다.

 
재사용하기도 어렵고 허접한 인터넷에 돌아다니는 게시판 소스말고. 이런거에 익숙해지라는 거에요.
전부 이해하지 못해도 괜찮아요. 번호를 클릭하면, hidden값만 바꾸고 submit을 날려버려.
<a href = 'javascript:_goPage(1)'>1</a>
자바스크립트를 만들고 Function의 _goPage() 생성. 값 전달.
모든 링크가 _goPage()로 만들고 _goPage()부분만 오버라이드 하면 된다.
PageMaker가 검색조건을 다 물고 있으면 페이지 구분 부터, 검색어 무는 것 까지 전부 처리가능.
이렇게 만들어진 소스는 include를 사용하면 재사용성이 증가한다.
PageMaker가 VO다. List 출력. 검색조건을 파라미터로 받아들인다면
게시판에서는 CRUD List가 전부야.
검색기준 Criteria를 가지는 객체생성.
Generic_DAO 생성.
CRUD에 List추가 - Public List <E> list(Criteria cri) throws Exception;
동작하는 기능을 파라미터로 던져줄 수 없으니까. 어쩔 수 없이 람다식이 나올 수 밖에 없는 것.
3단 구현: Interface -> 추상클래스 -> 구현
인터페이스마다 따로 구현해야하는 문제점에 직면한다. 이 문제를 자바에서는 해결할 수 없어요.
SQL Executor를 매번 바꿔야 할 문제. 해결할 수 있는 방안 -> My batis
이런 좋은 기능들은 여러 번 반복 작업을 해봐야 얼마나 좋은지 알게 된다.
My batis 는 한국에서만 열심히 사용 ㅠ ㅠ (전자정부 프레임워크)
쿼리문이 전부 XML로 빠지고 여기에서 값을 준다.
적당한 SQL과 적당한 파라미터만 던져주면 파라미터 세팅해주고 Resultset도 해결해준다.
파라미터를 자동으로 세팅해주고 결과데이터를 자동으로 처리해주는 녀석이 있다면, 우리는 게시판을 좀 더 쉽게 만들 수 있지 않을까. 목표를 DAO에 코딩을 넣지 않는 것. 무배포. 무코딩. 무설정.
원래 mybatis는 Spring하고 같이 써요.
// 일단 오늘 한 코드가 어떻게 돌아갔는지. 
// 우리 팀이 왜 결과가 안 나왔는지 분석 할 것. 다음에 만들면 어떻게 빨리 만들 것인가. 내가 뭘 할 것인가. 
 

+ Recent posts