21 Mar 2018
|
Dev
HTML
태그 학습
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset=”utf-8”> : 문자열을 utf-8로 처리 한다는 의미, 한글깨짐 방지
- <body>
- <a> : 링크 anchor 태그
- <p> : 단락 정보를 표현, 간격조정은 CSS를 - 통해서 간격을 조정한다.
- <br> : 줄바꿈 시각적인 줄바꿈
- <img> : 이미지 삽입
- src : 파일
- width : 넓이
- height : 높이
- alt : alternative 이미지를 사용할 수 없었을 때
- title : 도움말 이미지 마우스를 올렸을 때
- <table> : 표 구조화된 정보를 표시하기 위해
- <tr> : 행
- <td> : 열
- rowspan : 숫자 만큼 행 병합
- colspan : 숫자 -1 만큼 열 병합
- <thead> : 테이블 머릿말
- <th> : 테이블 머릿말의 각 컬럼명을 표현
- <tbody> : 테이블 본문(정보)
- <tfoot> : 테이블의 최하단으로 표시
- 테이블을 꾸밀 때는 속성보다는 CSS를 많이 사용한다.
- <form>
- <input>
- type :
- text : 문자열 입력
- password : 비밀번호 입력
- submit : 버튼이 표시, 서버로 정보 전송
- name : 서버로 전송할 값에 이름을 정함
- value : 입력창의 값
-
<textarea> : 여러줄을 입력할 때 사용, default value는 열림 태그와 닫힘 태그 사이에 작성한다.
- <select> : dropdown 선택지
- name : 서버에 전송할 값의 이름
- multiple : 다중 선택
- <option> : 선택지
- value : 서버에 전송할 값
- <ipnut type = “radio”> : 라디오 버튼 선택지 중 하나만 선택되도록 할 때 사용
- name : 동일하게 이름으로 그룹핑된다.
- value : 서버에 전달될 값
- <input type = “checkbox”> : 한번에 여러개를 선택할 수 있을 때 사용
- name : 동일하게 이름으로 만들어 그룹핑한다. 서버에 전달될 정보의 이름
- button javascrip와 사용할 때
- <input type = “button” value =”버튼” onclick=””>
-
<input type =”reset”> : form태그 안의 내용이 지워진다.
- 데이터 전송 - hidden
- <input type=”hidden” name=”” >
- <label> : 콘트롤러 이름
- for : 연결하고 하는 태그의 id를 입력
- 연결하고자 하는 태그를 label태그로 감싼다.
- method
- get : url에 값이 노출 된다
- post : url에 값이 노출되지 않고 데이터 전송
- 파일업로드
- <form action=”” method=”post” enctype=”multipart/form-data”>
- <input type=”file” name=””>
- HTML은 정보를 담는 그릇이다
- <meta> : 데이터를 설명하는 데이터
- <meta charset=”utf-8”>
- <meta name=”description” content=”내용”>
- <meta name=”keywords” content=”블라,블라,블라”>
- <meta name=”author” content=””>
- <meta http-equiv=”refresh” content=”30”> : 30초마다 페이지가 다시 읽어들인다.
- semantic : 의미론적인 태그
- <header> :
- <nav> : 네비게이션의 역할
- <article> : 본문
- <section> : 특정역할로 정의하기 애매한 정보
- <footer> : 웹사이트 하단에 부가적인 항목을 표시
검색엔진 최적화
- robots.txt : 검색엔진에 접근을 안내하는 정보
- sitemap :
모바일 최적화
<meta name="viewport" content="width=device-width, initial-scale=1.0">
외부문서삽입-ifram
보안 : iframe 속성에 sandbox를 넣어주면 가져오는 페이지의 위협적인 요소를 실행시키지 않는다. javascript 혹은 입력페이지에 의한 데이터 전송 등을 막을 수 있다.
HTML5
- <video> : 브라우저마다 지원하는 코덱이 다르다.
<video width="" controls>
<source src ="">
</video>
- cnaiuse.com : 현재 브라우저의 지원하는 태그 안내
- HTML5의 입력양식 : 모바일 지원이 강화되었다. 입력값의 min 과 max를 지정할 수 있다.
HTML5 입력양식의 속성들###
- <form>
- autocompleate=”on” : form내의 자동완성 켬
- <input>
- autocompleate=”off” : 자동완성 끔
- palceholder =”” : 입력창에 안내
- autofocus : 해당 입력창으로 선택되어 입력을 기다림
HTML5 입력 값 체크###
- <input>
- required : 필수 항목
- pattern = “[a-zA-Z]” : 정규표현식
30 Jan 2018
|
1. web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>MVC Starter</display-name>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>local</param-value>
</context-param>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring/root-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
스프링으로 tomcat과 스프링을 함계 구동했을 때 web.xml의 구조이다.
스프링으로 만든 application을 war로 빌드 후 tomcat의 webapp 디렉토리 밑에 위치 시키고 tomcat을 기동 한다.
tomcat은 war를 풀고 위의 web.xml을 읽는다.
servletDistpatcher를 생성하는데 해당 해당 config xml의 위치는 /config/spring/root-config.xml로 설정 하였다. 이때 classpath로 해당 xml의 위치를 설정하였는데 그 실제 코드를 작성할 때 위치는 src/main/resources 아래이다.
\<load-on-startup>1\</load-on-startup>
초기화 시 우선순위를 의미한다. 0보다 큰값을 가지고 있으면 서버 기동과 동시에 초기화 된다.
위에서 생성한 dispatcherServlet이 담당할 URL을 아래 <servlet-mapping> 에서 등록하여 / 이하로 들어오는 요청을 dispatcherServlet에서 하도록 했다.
2. root-config.xml
관리적인 측면에서 config 파일을 아래와 같이 분리해놓았다. 이는 개발자 마다 다르게 설정할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="properties-config.xml"/>
<import resource="datasource-config.xml"/>
<import resource="tx-config.xml"/>
<import resource="mybatis-config.xml"/>
<import resource="aop-config.xml"/>
<import resource="app-config.xml"/>
<import resource="mvc-config.xml"/>
</beans>
2.1 mvc-confg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="net.ujacha.hot.mvcstarter">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/" />
</beans>
2.1.1 <mvc:annotation-driven />
spring web mvc에서 사용되는 값들을 자동 등록해 준다.
2.1.2 <context:component-scan base-package=”net.ujacha.hot.mvcstarter”>
base-package 아래에서 filter로 적용된 controller annotation 타입만을 읽어 들여 등록 한다.
2.1.3 <bean class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>
DispatcherServlet은 뷰 리졸버를 이용해서 controller가 리턴한 뷰 이름에 해당하는 뷰 오브젝트를 가져온다.
jsp 파일을 WEB-INF 아래에 둔 이유는 사용자가 url을 통해 직접 jsp파일을 실행하지 못하도록 한 것이다.
2.1.4.<mvc:resources mapping=”/resources/**” location=”/resources/” />
tomcat에서 webapp/resources를 접근하게 하기 위해서 설정
2.2 datasource-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close"
p:driverClassName="#{jdbc['jdbc.driverClassName']}"
p:url="#{jdbc['jdbc.url']}"
p:username="#{jdbc['jdbc.username']}"
p:password="#{jdbc['jdbc.password']}"
/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="repository.UserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
datasource 빈은 dbcp2로 사용하고 객체를 생성할 설정값들은 property파일로 따로 설정하여 사용한다.
sqlSessionFactory : sqlSession객체를 생성한다. sqlSession은 commit이나 rollback, select같은 db관련 method가 정의된 interface이다.
2.3 mybatis.config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:config/mappers.user/UserMapper.xml"/>
<property name="typeAliasesPackage" value="repository"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
datasource-config에서는 직접 UserMapper 객체를 생성했지만 이를 SqlSessionTemplate를 통하여 Mapper 객체를 가져오도록 변경하였다.
26 Jan 2018
|
Dev
Spring
2018년 01월 26일.
springboot로만 프로젝트를 생성하여 연습하다 spring을 직접 설정하여 만들어 보니 spring context 설정 부분을 좀 더 이해할 수 있게 되었다.
연습을 목적으로 spring으로 web application을 만들고 있다. tomcat을 따로 설치하고 war로 배포하는 구조이다. context는 xml 파일로 구성하고 web.xml에 applicationcontext와 servletcontext를 등록하였다. applicationcontext와 servletcontext를 하나로 합쳐서 web.xml에 등록을 하였더니 junit으로 테스트를 만드는 과정에서 문제가 발생하였다.
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>.
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
junit의 contextloader에 servletcontext를 읽어들이자 context를 읽어들이는데 에러가 발생
applicationcontext와 serveltcontext를 분리하고 applicationcontext만을 Juit에서 읽어들이 도록 처리
rest api로 처리 중 List를 반환했을 때 json으로 자동 형변환 되지 않아 에러가 발생 하였다.
이 문제는 jackson-databind 라이브러리 추가하여 해결
18 Jan 2018
|
Dev
toString
2018년 01월 18일.
toString
IntelliJ에서 command+n으로 class의 toString을 만들 수 있다.
자동완성된 toString의 형식은 멤버변수들을 단순 출력 시킨다.
스타일에 맞게 toString을 만들고 싶다면 아래 코드처럼 만들면 된다.
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
ToStringBuiler를 사용하려면 commons-lang3를 추가해야 한다.
17 Jan 2018
|
Dev
LOG
2018년 01월 17일.
로그 레벨 : TRACE > DEBUG > INFO > WARN > ERROR > FATAL
TRACE : DEBUG 보다 상세한 정보
DEBUG : 디버깅을 위한 정보
INFO : 상태 변경과 같은 정보성 메시지
WARN : 처리 가능한 문제로 향후 ERROR의 원인이 될 수 있는 경고성 메시지
ERROR : 요청을 처리하는 중 문제가 발생한 경우
FATAL : 아주 심각한 에러가 발생한 상태
- 로그레벨을 TRACE로 설정 하였다면 모든 로그 레벨이 출력 된다.
- 로그레벨을 FATAL로 설정 하였다면 FATAL보다 하위 수준 레벨의 로그는 출력되지 않는다.
모든 로그를 출력하도록 한다면 정작 중요한 로그를 놓칠 수 있음으로 로그레벨을 INFO로 설정 한다
스프링부트에서 출력 로그 수준을 변경하고 싶다면 application.properties 파일에 아래 코드를 추가하여 원하는 로그 레벨로 수정 한다
logging.level.com.portal.personal=DEBUG
개발 중 로그를 찍을 편한 system.out.println(““)으로 할 경우가 많다. 개발 도중 디버깅 하고자 할때는 System.out.println()보다는 느리지만 가독성이 좋은 System.out.format()을 사용 하는게 더 좋다. c언어의 print()와 사용법이 비슷한다
로그를 찍고 싶을 때는 slf4j나 LogBack를 사용하도록 한다. (slf4j: Simple Logging Facade for java)