2017년 7월 28일 금요일

Tomcat 8.5 + sts 3.9 +java 1.8 에서 스프링 기본 프로젝트 실행안될때

Tomcat 8.5 + sts 3.9 +java 1.8 에서 스프링 기본 샘플 생성하고 실행하니 이런 메시지가..
알아보니 pom.xml 앞줄에

<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>


<java-version>1.8</java-version>
<org.springframework-version>4.1.7.RELEASE</org.springframework-version>
응? 4.1.7 RELEASE ? ㅆㅂ야 sts 3.9 받았다니까..
여튼 이렇게 하면 실행됨.

아래 에러 중에 java 버젼이 틀렸다는거 찾을수 있는분?  톰고양이 쉐끼 매번 고생시키네..
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
... 6 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@39fa9a06]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4860)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4992)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@6cb46084]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:709)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 9 more
Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: invalid LOC header (bad signature)
at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
... 12 more
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
at java.util.zip.ZipFile.read(Native Method)
at java.util.zip.ZipFile.access$1400(ZipFile.java:60)
at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:717)
at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:419)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at sun.misc.IOUtils.readFully(IOUtils.java:65)
at java.util.jar.JarFile.getBytes(JarFile.java:425)
at java.util.jar.JarFile.getManifestFromReference(JarFile.java:193)
at java.util.jar.JarFile.getManifest(JarFile.java:180)
at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:111)
... 13 more

Jul 29, 2017 2:23:52 PM org.apache.catalina.core.ContainerBase startInternal
SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.Catalina.start(Catalina.java:656)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:947)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more

Jul 29, 2017 2:23:52 PM org.apache.catalina.startup.Catalina start
SEVERE: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.startup.Catalina.start(Catalina.java:656)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 9 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:947)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more

2017년 7월 11일 화요일

Java Refactoring

히로시 유키 저 "Java 언어로 배우는 리팩토링 입문" 부록에 나오는 리팩토링 목록입니다.

http://sinihong.tistory.com/m/11#toc_1


2017년 7월 10일 월요일

자바디자인 패턴

1.Strategy pattern
: 대장-관리인(인터페이스)-일꾼 의 구조로 설계함. 일꾼은 항상 다른일을 하기 때문에, 관리인에게 공통된 명령(일시작해,밥줘,퇴근시켜...아..사장쉐키들이 하는거였네..) 사장님 패턴이라고 해야하나..아니면 관리인 패턴인가
한개의 인터페이스와 여러개의 구현체, 인터페이스를 통해 명령을 내릴 대장클래스

2.Adapter Pattern
: 열라좋은 헤어드라이기를 해외여행때마다 가지고 다니고 싶은데, 나라마다 코드가 제각이니 각 나라에 맞는 코드를 끼워넣음. 내가 원하는 것을 하기위해서는 기존의 소스에 아답터인터페이스(돼지코,일자코...)를 확장시켜야 함.
[기존코드]를 추상화된 애댑터에 지정, 확장한 소스에서 기능 확장

3.Template Method Pattern
: 공장에서 자동차를 만들다보니, 본체-바퀴-문짝 조립순이더라, 사람한테 시키니 실수도 많고 표준대로 지키지도 않고...그래서 순서대로 조립할수 있는 라인을 만들고 기계를 도입했다.
추상화된 생산절차-확장해서 자세한 작업을 구현, 총 감독할 실행부

4.작업중...

2017년 7월 9일 일요일

스프링프레임워크 무료 동영상강좌 - inflearn.com

강좌에 대한 요약은 여기 http://mj-documents.readthedocs.io/ko/latest/JAVA%20(%20Spring%20)/Spring%20%ED%95%84%EA%B8%B0/

강좌의 소스에 대한 이해는 대충.
spring_11_2_ex1_springex
--------------------------------------------
1. web.xml 의 <servlet> 설정에서 <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 읽음
2. 콘트롤러 파일을 찾기 위해서 <context:component-scan base-package="com.javalec.ex" /> 지정
3. 화면 표시용 view 가 있는 리소스 위치를 지정하기 위해서 prefix,suffix 값을 지정
4. context root,그러니까 http:localhost:8080/ex 이렇게 뜨는 거는 Server 의 Tomcat v7.0.... 으로 추가한 서버를 더블클릭하고 server.xml 파일의 context path 를 변경하면됨.
5. 프로젝트 에서도 Properties>Web Project Settings 에서도 context root 를 변경
6. HomeController 자바 파일에서는 @Requestmapping 으로 넘어온 value 주소에 대해서만 실행함.
7. model.addAttribute("serverTime", formattedDate ); 로 화면에 출력할 변수를 만들어서 "home" 뷰에 전달함.
8. /WEB-INF/views/ + "home" + jsp 파일에서는 ${serverTime} 값을 출력함

spring_11_3_ex1_springex
--------------------------------------------
spring_11_2_ex1_springex 와 같은 소스 다만
<resources mapping="/resources/**" location="/resources/" /> 로 지정안된 폴더에서 이미지 가져오려 하면, 가져올수 없다는 것을 확인


spring_12_1_ex1_springex
--------------------------------------------
spring_11_2_ex1_springex 와 같은 소스 다만
콘트롤러에서
@RequestMapping("/board/view")
@RequestMapping("/board/content")...
로 했을때의 별도의 메소드에서 처리됨을 확인.
각 메소드에서는 return "뷰값"을 하여
해당 파일(/WEB-INF/views/ + "뷰값" + jsp)이 있으면 그걸 화면 출력한다.


spring_12_4_ex1_springex
--------------------------------------------
spring_11_2_ex1_springex 와 같은 소스 다만
콘트롤러에서 클래스에
@RequestMapping("/board") 를 추가하고
메소드에
@RequestMapping("/")
@RequestMapping("/write")...
로 했을때 웹상에서의 주소접근이
http://localhost:8080/board/
http://localhost:8080/board/write
로 되는 것을 확인- 한참 헤멨네...


spring_13_1_ex1_springex
--------------------------------------------
@RequestMapping("board/confirmId")
public String confirmId(HttpServletRequest httpServletRequest, Model model) {
에서는  httpServletRequest.getParameter("id") 등과 같이 http 로 넘어오는 값을 받아서 처리하는 예제

@RequestMapping("board/checkId")
public String checkId(@RequestParam("id") String id, @RequestParam("pw") int pw, Model model) {
에서는  @RequestParam 어노테이션을 이용하여 request 된 데이터 취득.



spring_13_4_ex1_springex
--------------------------------------------
@RequestMapping("/student/{studentId}")
public String getStudent(@PathVariable String studentId, Model model) {
주소라인에 SEO 방식의 주소로 할수 있도록 하는 예제. 즉 http://localhost:8080/student/아빠/ 라는 식으로 http 주소를 받아서 '아빠' 이름에 해당하는 변수를 활용할수있다. get,post 도 필요없이 주소라인에서 직접 변수를 전달하는 방식, 이렇게 링크를 하는 이유는 검색엔진에서 주소라인의 문구가 검색 결과로 잡하기 때문에...
@RequestMapping("/student/{studentId}/{nickname}")
public String getStudent(
@PathVariable("studentId") Optional<String>  studentId,
@PathVariable("nickname") Optional<String>  nickname,
Model model
) {
머..이런식도 가능.



spring_14_1_ex1_springex
--------------------------------------------
콘트롤러에서 지정한
http://localhost:8080/ex/index 화면에서 전송을 누르면
전송 폼이 나타나고 값을 입력후 전송하면.
@RequestMapping(method = RequestMethod.POST, value = "/student") 또는
@RequestMapping(method = RequestMethod.GET, value = "/student") 가
적절히 실행된다.
get 을 확인하려면
http://localhost:8080/ex/student?id=1234 하면됨.


spring_14_2_ex1_springex
--------------------------------------------
spring_13_4_ex1_springex 랑 비교하면 좋음.
폼정보가 있는 index.jsp 에서 전송을 하면,
콘트롤러에서
@RequestMapping("/studentView")
public String studentView(@ModelAttribute("studentInfo") StudentInformation studentInformation){
메소드를 실행하는데, 이때 넘어온 폼의 정보를 한번에 StudentInformation 클래스에 setter 한다.
물론 form 의 input 이름과 클래스변수의 이름이 같고 seter 가 있는 변수에 한해서만이다.
ModelAttribute("studentInfo") 여기의 "studentInfo" 가 view 에서 변수명이 된다.

***중요한 거는 StudentInformation.java 클래스에 자동으로 담겨주는 거.폼의 인풋 정보랑 modelAttribute 에서 지정한 클래스 정보랑


spring_14_3_ex1_springex
--------------------------------------------
리다이렉트 redirect: 예제들.


spring_15_1_ex1_springex
--------------------------------------------
StudentController 에서  @RequestMapping("/student/create") 주소로 폼 내용이 넘어올때,
public String studentCreate(@ModelAttribute("student") Student student, BindingResult result) {
이름의 인풋값들중에 student 객체에 있는 변수는 할당을 한다.
student 객체에 입력된 값으로 StudentValidator 의 검증 메소드를 실행한다. 이때 에러가 발생하면, crete 페이지로 가고 아니면  done 페이지로 간다.
폼주소  http://localhost:8080/spring_15_1_ex1_srpingex/studentForm


spring_15_2_ex1_springex
--------------------------------------------
spring_15_1_ex1_springex 과 같은 내용, 밸리데이터만 수정


spring_15_3_ex1_springex
--------------------------------------------
spring_15_1_ex1_springex 과 같은 내용, 밸리데이터만 수정
@InitBinder 확인.?


spring_16_1_ex1_springex
--------------------------------------------
BController.java
이 화일에서는 각 요청 주소 에 따른 @RequestMapping("...") 을 한다.
command 패턴을 사용해서 각 코맨드에 맞는 클래스,메소드를 실행한다.(좋음)
com.javalec.spring_16_1_ex1_srpingex.command 패키지에는 각 커맨드에 맞는 클래스가 있다.
Dao 를 썼지만 , 예전 방식으로 접속함.(예제니까..)


spring_21_1_ex1_springex
--------------------------------------------
servelet-context.xml 에서
<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
....
</beans:bean>
JDBC 이용한거만 좀 다름..




spring_22_1_ex1_springex
--------------------------------------------
servelet-context.xml 에서
<beans:bean name="dao" class="com.javalec.spring_pjt_ex.dao.TicketDao" >
로 빈 지정하고.
HomeController 에서
@Autowired
public void setDao(TicketDao dao) {
Autowired 처리되어 dao 변수는 com.javalec.spring_pjt_ex.dao.TicketDao 할당됨





spring_22_2_ex1_springex
--------------------------------------------
servelet-context.xml 에서
<beans:bean name="dao" class="com.javalec.spring_pjt_ex.dao.TicketDao" >
로 빈 지정하고.
HomeController 에서
@Autowired
public void setDao(TicketDao dao) {
Autowired 처리되어 dao 변수는 com.javalec.spring_pjt_ex.dao.TicketDao 할당됨
아직 트랜잭션 처리되지 안음.


spring_22_2_ex2_springex
--------------------------------------------
spring_22_2_ex1_springex 동일.
스프링에서 지원하는 TransactionDefinition 으로 간단히 트랜잭션 지정.


spring_23_1_ex1_springex
--------------------------------------------
spring_22_2_ex2_springex 동일.
좀더 간단히 TransactionTemplate 을 이용
설정에 추가됨
<beans:bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<beans:property name="transactionManager" ref="transactionManager"></beans:property>
</beans:bean>





spring_23_2_ex1_springex
--------------------------------------------
spring_23_2_ex2_springex 동일.
좀더 간단히 TransactionTemplate 을 이용
설정에 추가됨
<beans:bean name="ticketCommand" class="com.javalec.spring_pjt_ex.command.TicketCommand" >
빈에 연결
@Autowired
public void setTicketCommand(ITicketCommand ticketCommand) {
this.ticketCommand = ticketCommand;
}
빈에 연결시에 인터페이스와 implement 구형제가 한세트라서, 자동으로 구현클라스에 할당됨
트랜잭션의 전파 속성 별도로 학습 필요






spring_25_1_ex1_springex
--------------------------------------------
보안관련, 한글처리



spring_26_1_ex1_springex
--------------------------------------------
보안관련, 한글처리

spring_26_2_ex1_springex
--------------------------------------------
보안관련, 한글처리

spring_27_1_ex1_springex
--------------------------------------------
보안관련, 한글처리





spring_28_1_ex1_springex
--------------------------------------------
JDBC 방식임.




spring_29_1_ex1_springex
--------------------------------------------
마이바티스 를 사용하기 위해서는

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource"></beans:property>
<beans:property name="mapperLocations" value="classpath:com/javalec/spring_mybatis/dao/mapper/*.xml"></beans:property>
</beans:bean>

<beans:bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<beans:constructor-arg index="0" ref="sqlSessionFactory"></beans:constructor-arg>
</beans:bean>
추가해야함.
value="classpath:com/javalec/spring_mybatis/dao/mapper/*.xml" 는 프로젝트 마다 다름.

스트링에서 마이바티스를 이용하면
mapper 폴더의 xml 과 인터페이스 를 1:1 로 연결함.
즉 mapper/OOO.xml 에는
<mapper namespace="com.javalec.spring_mybatis.dao.IDao">
와 같이
com.javalec.spring_mybatis.dao.IDao 인터페이스에 연결한다.

이는
즉 mapper/OOO.xml 에는 에는
<mapper> 밑으로
<select id="listDao" resultType="com.javalec.spring_mybatis.dto.ContentDto">
SELECT * FROM BOARD ORDER BY MID DESC
</select>
로 선언됨.

이를 가지고 콘트롤러에서
IDao dao = sqlSession.getMapper(IDao.class); Idao 에는 현재 xml 파일이 매핑되어 있음.
model.addAttribute("list", dao.listDao) 매핑된 xml 속성(쿼리element) 중에 id 가 listdao 인 놈만 가져와서 list (모델속성)에 할당해서 화면에 뿌릴수 있게됨.
화면에 뿌릴때는 list.db필드명 식으로딤.





spring_30_1_ex1_springex
--------------------------------------------
xml 이용한 연습.
xml 에 인자 는 #{param1} #{param2} 식으로.