
์ฌ๋ฌ๊ฐ์ง hexo ํ
๋ง์ค์ ๊ทธ๋๋ง(?) ์์ด๋ก ๋ ๋ฌธ์๊ฐ ์์ด์ ์ ์ฉํด๋ณด๊ฒ ๋ tranquilpeak ๋ผ๋ ํ
๋ง. ์ค๋์ ํด๋น ํ
๋ง๋ฅผ ์ ์ฉํ๋ฉด์ ๊ฒช์ ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ ์ ์ฉ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ฐ๋ตํ๊ฒ๋๋ง ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. (๋ค๋ฅธ ํ
๋ง๋ค์ ๊ฑฐ์๋ค ์ค๊ตญ์ชฝ์ด๋ ์ผ๋ณธ…)๋จผ์ hexo ๊ณต์์ฌ์ดํธ์์ ์๋ ค์ฃผ๋ ํ
๋ง๋ค์ ๋ค์ ์ฌ์ดํธ์์ ํ์ธํด ๋ณผ์ ์๋ค.
https://hexo.io/themes/index.html ๊ธฐ์กด์๋ hueman์ด๋ผ๋ ํ
๋ง๋ฅผ ์ฌ์ฉํ๊ณ ์์๋๋ฐ (๋งํฌ), ์ค๋๋ง์ ๋ธ๋ก๊ทธ๋ฅผ ๋ค์(?) ์์ํ๋ ๋๋์ ๋ด๋ณด๊ณ ์ถ์๊ณ ๋ณด๋ค ๋ ์ฌํํ๊ณ ์ ํ์ ์ํ๊ฒ ๊ฐ์(์์ ํ ํ์ ์๊ฐ) ํ
๋ง๋ฅผ ์ฐพ์๋ณด๋ค tranquilpeak์ด๋ผ๋ ํ
๋ง๋ฅผ ์ ํํ๊ฒ ๋์๋ค.
๊ณต์ํํ์ด์ง : https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak ์ํ์ฌ์ดํธ : http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/ ์ฐ์ ๊ฐ๋ตํ๊ฒ ์ค์น๊ณผ์ ์ ๋์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
themes ํด๋๋ด์ ํ
๋งํ์ผ์ ๋ฐ์ํ ์์ถ ํด์ ํ
๋ง ํด๋ ์ด๋ฆ์ ๋ณ๊ฒฝ _config.yml ํ์ผ ๋ด์ ํ
๋ง ์ค์ ๋ถ๋ถ ๋ณ๊ฒฝ ( theme: tranquilpeak ) hexo clean โ hexo generate โ hexo server(or hexo deploy) ์ด๋ ๊ฒ ํ๋ฉด ์์ฃผ ๊ฐ๋จํ๊ฒ ํ
๋ง๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค. ํน์ฌ๋(ํ์์ฒ๋ผ) ๊ธฐ์กด ํ
๋ง๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ๋ณ๋์ ๊ณผ์ ์ด ์ถ๊ฐ๋ก ํ์ํ๋ค. ๊ธฐ์กด์๋ css๋ js๋ง ๋ณ๊ฒฝํ๋ฉด ๊ฐ๋จํ ์์ ๋์๋๋ฐ ์ด ํ
๋ง๋ ์ฝ๊ฐ์ ๋น๋(?)๋ฅผ ํ์๋ก ํ๋ค. ๋ฐ๋ผ์ css๋ js๋ฑ html ์์๋ค์ ์์ ํ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค.(ํ
๋งํด๋ ์ต์์์์)
npm install bower install css ๋ js ๋ณ๊ฒฝ grunt build hexo clean โ hexo generate โ hexo server(or hexo deploy) ๋๊ฐ์ ๊ฒฝ์ฐ๋ ํ
๋ง์ ์ ์ฉ๋ ํฐํธ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด ๋ธ๋ก๊ทธ ๋ฅผ ์ฐธ์กฐํ์๋ค. (ํด๋น ์ํฐํด์๋ค ๋๊ธํญํ์ ใ
ใ
;;)
๋ง์ง๋ง ํฌ์คํ
์ ํ์ง ๋ฒ์จ 3๊ฐ์์ด ์ง๋ฌ๋ค. ๊ทธ๋ ๊ฒ ๋ฐ๋นด๋๊ฒ๋ ์๋๊ณ ๋ธ๋ก๊ทธํฌ์คํ
์ ํ ์๊ฐ์ด ์๋๊ฒ๋ ์๋๋ฐ ์ด๋๋ง ๋ค์ ์ ์ ์ฐจ๋ฆฌ๊ณ ๋ธ๋ก๊ทธ๋ฅผ ํฌ์คํ
ํ๋ ค๊ณ ๋ณด๋ 3๊ฐ์์ด๋ผ๋ ์๊ฐ์ด ํ๋ฌ๋ฒ๋ ธ๋ค์ฑ๋ฐํด๊ฐ์ ์ผ์, ๋์ฆ๋งํ ์ผ์ด๋์ ํ์ฌ์ถ๊ทผํ๊ณ ์ ์ ์์ด ์ผํ๋ค๊ฐ ํด๊ทผ, ๊ทธ๋ฆฌ๊ณ ๋ฆ๊ฒ๊น์ง ์ ๋ชป์ด๋ฃจ๋ค ๋ ๋ค์๋ ์ด๋ฉด ๋์ฆ๋งํ ์ผ์ด๋๊ณ … ๋ญ๊ฐ ๋ณํ๊ฐ ํ์ํ๋ค.
๋งค์ผ ์ผ๊ธฐ์ฐ๊ธฐ : ์ผ๊ธฐ๋ผ๊ณ ํด๋ดค์ ๊ฑฐ์ฐฝํ๊ฑด ์๋๊ณ ๋ฑ 3๊ฐ์๋ง ์จ๋ณด์. ์ค๋ ๋ญํ๋์ง. ์๊ธฐ์ ์ ๋ฑ 10๋ถ์ด๋ฉด ์ข์๋ฏ ์์นจ์ ์ผ์ฐ ์ผ์ด๋๊ธฐ : ์์๊ธ ์์์ ํ๋ชฉ ๋ฐฐ๋๋ฏผํด. ์ฃผ๋ง์๋ ์ผ์ฐ์ผ์ด๋๊ณ . ์ผ์ฐ์ผ์ด๋๋ฉด ๋จน์ด๋ ๋ ๋จน๋๋ค๊ณ ํ์ง ์์๋๊ฐ ๋ฌ๋ ฅํ์ฉํ๊ธฐ : ์ด๋ํ๋๊ฒ๋ ๊ทธ๋ ์ง๋ง, ๋ฌ๋ ฅ์ ์์ฃผ ๋ณด๋ฉด์ ๋นผ๋จน์ง ๋ง์์ผ ํ ์ค์ํ ๋ ๋ค์ ๋ฐ๋์ ๋ฉ๋ชจํ๊ณ ๊ธฐ์ตํ์ ๊ธฐํ : ์ฑ
์ข ๋ง์ด ์ฝ๊ณ ์ด๋๋ ๊พธ์คํ ํด์ผ๊ฒ ๋ค. ๋ฌผ๋ก ๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํ
๋ ์์ง๋ง๊ณ . ์ฒซ์ ์ ๋ฐฐ๋ถ๋ฅด๋ด. ํ๋๋์ฉ ํผ์ฆ ๋ง์ถฐ๋๊ฐ๋ฏ ํด๋ณด๋ค๋ณด๋ฉด ๋ด ์์ ์ด ๋ฐ๋์ด ์๊ฒ ์ง.

Select๋ฌธ์ด ์๋ ๋ค๋ฅธ SQL Query(insert, update ๋ฑ) ๋ฅผ ์คํํ๊ณ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค. ์ ํํ ์ ์ํ๋์๋์ ๋ํ ํ์ธ. ์ด๋ป๊ฒ ์ฟผ๋ฆฌ๊ฐ ์ ์ํ๋์๋๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. โป ์ฐธ๊ณ url : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html
useGeneratedKeys, keyProperty ์ต์
์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์์ฑํค๋ฅผ ์ง์ํ๋ค๋ฉด(mySql ๊ฐ์) ํด๋น์ต์
์ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด ๋ฐ์์ ์๋ค. ์๋ก๋ค์ด ํ๋ผ๋ฏธํฐ๋ก ์๋ ๋ชจ๋ธ๊ฐ์ฒด๋ฅผ ๋๊ธด๋ค๊ณ ๊ฐ์ ํ๊ณ
public Student { int id; String name; String email; Date regist_date; } ์๋ mybatis ๊ตฌ๋ฌธ์ผ๋ก insert๋ฅผ ์๋ํ๊ฒ๋๋ฉด, ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด Student ๊ฐ์ฒด์ id๊ฐ์ insert ํ์๋์ key๊ฐ(id)์ด ๋ค์ด์ค๊ฒ ๋๋ค.
Student student = new Student(); student.setName('bla'); student.setEmail('bla@naver.com'); mapper.insertStudents(student); // ์ฟผ๋ฆฌ์คํ student.getId(); // ์ถ์ถ ๊ฐ๋ฅ <insert id="insertStudents" useGeneratedKeys="true" keyProperty="id" parameterType="Student"> insert into Students ( name, email ) values ( #{name}, #{email} ) </insert> selectKey ์ต์
Oracle ๊ฐ์ ๊ฒฝ์ฐ๋ Auto Increment ๊ฐ ์๊ณ Sequence๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ ์ต์
์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ฐํ์ ์ธ(?) ๋ฐฉ๋ฒ์ผ๋ก ์์๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ์๊ฐ ์๋ค. ํ๋ผ๋ฏธํฐ์ ๋ชจ๋ธ์ด๋ java๊ตฌ๋ฌธ์ ์์ ๋์ผํ๊ณ xml ์ฟผ๋ฆฌ ๋ถ๋ถ๋ง ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
<insert id="insertStudents" parameterType="Student"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select SEQ_ID.nexyval FROM DUAL </selectKey> insert into Students (id, name , email) values (#{id}, #{name}, #{email}) </insert> ์์๊ฐ์ ์ฝ๋์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ ์ id๊ฐ์ Sequence์ ์ํด ๊ฐ์ ์
ํ
ํ๊ฒ ๋๊ณ , ์๋์ ์ผ๋ก ํด๋น ๊ฐ์ Student์ id์ setํ๊ฒ ๋์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ์๊ฐ ์๋ค.
ํญ์ ํ
์ด๋ธ์ key๊ฐ์๋ง ํด๋นํ๋๊ฒ์ด ์๋๋ค. key๊ฐ๊ณผ๋ ์ ํ ์๊ด์๋ ๊ฐ๋ selectKey ๊ตฌ๋ฌธ์ผ๋ก ๋ฆฌํดํ ์๊ฐ ์๋๋ฐ order์ต์
์ AFTER๋ก ์ฃผ๊ณ ๋ฆฌํดํ๊ณ ์ ํ๋ ๊ฐ์ ๋ช
์ํด์ฃผ๋ฉด ๋๋ค. ์๋ ์ฝ๋์์๋ ์
๋ ฅํ ์ id๊ฐ์ Sequence์์ ๊ฐ์ ธ์ค๋๊ฒ ์๋๋ผ ์๋์ผ๋ก ๋ฃ์ด์ฃผ๊ณ , ์
๋ ฅํ๋ id์ ๋ง๋ regist_date ๊ฐ์ ๋ฆฌํด๋ฐ์ ์์์์ฒ๋ผ ๋์ผํ๊ฒ ๊ฐ๋ฅผ ๊ฐ์ ธ์ฌ์ ์๋ค.
<insert id="insertStudents" parameterType="Student"> <selectKey keyProperty="regist_date" resultType="java.util.Date" order="AFTER"> select regist_date FROM students WHERE id = #{id} </selectKey> insert into Students (id, name , email, regist_date) values (#{id}, #{name}, #{email}, syadate) </insert>

์ํฉ Oracle, Java 8, mybatis3 ํ๊ฒฝ Date์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ ์ด๋ฅผ select query๋ก ์กฐํํ์ฌ Model์ ๋ฐ์ธ๋ฉ ์ํค๊ณ ์ ํจ. ์ฟผ๋ฆฌ์ ์๋ฌด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์๊ณ Date ํํ๋ก Model์ ๋ฐ์ธ๋ฉ์ ํ๋ฉด ์๋ถ์ด๊ฐ ์์ด์ง 2017-01-01 00:00:00 ํํ๋ก ๋จ๊ฒ๋จ ๊ทธ๋์ ์๋์ฒ๋ผ ์ฟผ๋ฆฌ ์์ฑํ ๋๋ง๋ค TO_CHAR๋ฅผ ์ฌ์ฉํด์ ํฌ๋งท์ ๋ง์ถ์ด ํ๋ณํ์ ์ํค๊ณ Date ๋๋ String์ผ๋ก Model์ ๋ฐ์ธ๋ฉ ํ๊ณค ํ์. SELECT TO_CHAR(reg_ymdt, 'YYYY-MM-DD HH24:MI:SS') AS registDate FROM ... ์ด๋ ๊ฒ ํ๋ค๋ณด๋ query ๋ง๋ค๋๋ง๋ค ํ๋ณํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค์ผํ๊ณ , ์์นซ ํฌ๋งทํ์์ ๋ค๋ฅด๊ฒ ์ ์ผ๋ฉด ์๋ฑํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ฑฐ๋, Dateํ์ ๊ทธ๋๋ก ๋ฐ์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์์๋ ๋ค์ ํ๋ณํํ๋ ๊ณผ์ (String to Date)์ ํด์ค์ผ๋ง ํจ. .. ๊ท์ฐจ๋์ฆ์ ์์ : ์ฝ์ง 1. ์ฝ์ง์ ์์ 1-1. ์ค๋ผํด์ DATEํ โ java.sql.Date ์ ๊ฒฝ์ฐ mybatis์์๋ ์๋์ ์ผ๋ก org.apache.ibatis.type.SqlDateTypeHandler๋ฅผ ํธ์ถํ๊ฒ๋จ mybatis 3 ๋ฌธ์ ์ฐธ๊ณ ํด๋น ํธ๋ค๋ฌ์ ๋ด๋ถ ๋ฐ์ดํฐ ๋ณํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getDate(columnName); } java.sql.ResultSet.getDate()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ค์ ‘yyyy-mm-dd’ ๋ง ๊ฐ์ ธ์ ๋ฆฌํดํ๊ฒ๋จ (์ฌ๊ธฐ์ ๋๋ฒ๊น
ํด๋ณด๋ฉด rs.getTimestamp(columnName)๊ฐ์ ์๋ถ์ด๊น์ง ๋ค ๋ค์ด๊ฐ ์์) ๋ฐ๋ผ์ ์๊ฐ๊ฐ์ด ์๋ yyyy-mm-dd ํํ๋ก ๋ฆฌํด์ด ๋จ 1-2. ์ค๋ผํด์ DATEํ โ java.util.Date ์ ๊ฒฝ์ฐ mybatis์์๋ ์๋์ ์ผ๋ก org.apache.ibatis.type.DateOnlyTypeHandler๋ฅผ ํธ์ถํ๊ฒ๋จ mybatis 3 ๋ฌธ์ ์ฐธ๊ณ ํด๋น ํธ๋ค๋ฌ์ ๋ด๋ถ ๋ฐ์ดํฐ ๋ณํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { java.sql.Date sqlDate = rs.getDate(columnName); if (sqlDate != null) { return new java.util.Date(sqlDate.getTime()); } return null; } ์์ org.apache.ibatis.type.SqlDateTypeHandler ๋ณํ์ฝ๋์์ ๋ฐ์ํ ๋ฌธ์ ์ ๊ณผ ๊ฐ์ด yyyy-mm-dd ๋ง ๊ฐ์ ธ์์ java.sql.Date ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด ์ ๋ณด๋ฅผ ํ ๋๋ก java.util.Date ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ๋๋๋ฐ ์์ ์๊ฐ๊ฐ์ ๋บ ์ ๋ณด๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋์ผํ๊ฒ yyyy-mm-dd ํํ๋ก ๋ฆฌํด์ด ๋จ 2. ์ฝ์ง์๋ฃ, ํด๊ฒฐ์ ์์ ์ค๋ผํด + mybatis ํ๊ฒฝ์์ Dateํ์
์ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ํ์
ํธ๋ค๋ฌ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค๋๊ฑธ ์๊ฒ๋จ. 2-1. ์ค๋ผํด์ DATEํ โ java.sql.Date ์ ๊ฒฝ์ฐ ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ปค์คํ
ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ฑ๋ก์ ์์ผ์ค๋ค. mybatis-config.xml <typeHandlers> <typeHandler handler="com.naver.dbill.admin.common.handler.CustomDateHandler"/> </typeHandlers> CustomDateHandler.java ... import java.sql.Date; ... public class CustomDateHandler extends BaseTypeHandler<Date> { ... @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { Timestamp sqlTimestamp = rs.getTimestamp(columnName); if (sqlTimestamp != null) { return new Date(sqlTimestamp.getTime()); } return null; } ... } ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ์๋ถ์ด ๊ฐ์ด ์๋ ์์ ํ Date ํํ๋ฅผ ๋ณผ์ ์๋ค. 2-2. ์ค๋ผํด์ DATEํ โ java.util.Date ์ ๊ฒฝ์ฐ ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ปค์คํ
ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ฑ๋ก์ ์์ผ์ค๋ค. ๋จ, mybatis 3 ๋ฌธ์๋ฅผ ๋ณด๋ฉด java.sql.Date ์๋ ๋ค๋ฅด๊ฒ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋ typeHandler๊ฐ JDBC์ ๋ฐ๋ผ 3๊ฐ์ง๊ฐ ์๋ค. ๋ฐ๋ผ์ ์์ฑํ ์ปค์คํ
ํธ๋ค๋ฌ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ช
์์ ์ผ๋ก ์๋ฐํ์
๊ณผ JDBCํ์
์ ์ ์ด์ค์ผ ์ ์์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด ํด๋น ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. mybatis-config.xml <typeHandlers> <typeHandler handler="com.naver.dbill.admin.common.handler.CustomDateHandler" javaType="java.util.Date" jdbcType="DATE"/> </typeHandlers> CustomDateHandler.java ๋ ์์ ๋์ผํ๋ค. ( import java.util.Date; ์ฌ์ฉ์ผ๋ก ๋ณ๊ฒฝ ) ์ฝ์งํ๋ฉฐ ์๊ฒ๋ ๋ณด๋์ค ์ง์ java.sql.Date ๋ java.util.Date ์ ์์๋ฐ์๋ค. public class Date extends java.util.Date { } ๊ฒ์์ ํ๋ค๋ณด๋ฉด ์์์๊ฒ ์ง๋ง java.sql.Date ๋ JDBC๋ฑ์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ ํฉํ๊ณ , java.util.Date ์ ๋ณด๋ค ๋ฒ์ฉ์ ์ธ ๋ ์ง๋ ์๊ฐ์ ๋ณด๋ฅผ ๋ค๋ฃฐ๋ ์ ํฉํ๋ค๊ณ ํ๋ค. toString ๋ฉ์๋์ ๋ฆฌํด Format ํํ java.sql.Date : yyyy-mm-dd java.util.Date : EEE MMM dd HH:mm:ss zzz yyyy mybatis ์์ ํ๋ณํ์ mybatis 3 ๋ฌธ์์ ๋์์๋ ์๋ฐํ์
๊ณผ JDBCํ์
์ด ์ผ์นํ ๊ฒฝ์ฐ์ ํด๋น ํ์
ํธ๋ค๋ฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. ์ ์ํ ๋ ์กฐ์ธ ( http://d2.naver.com/helloworld/645609 ์์ฑํ์ ๋ถ ) Oracle์ JDBC ๋๋ผ์ด๋ฒ๊ฐ ์์ ๋ฐ์ผ๋ก ๋์ํ๋ค์.

์ผ๋ฐ์ ์ธ ์น ํ๋ก์ ํธ ๊ตฌ์ฑ์์๋ Controller๋ ๋ฒจ์์ ์๋ต์ ๋ฐ๊ณ ๋น์ง๋์ค ๋ก์ง์ ์ฒ๋ฆฌ ํ์ ๋ค์ View๋ ๋ฒจ๋ก ๋์ด๊ฐ๋๊ฒ ํต์์ ์ธ ํ๋ฆ์ด๋ค. ์ด ๋ถ๋ถ์์ ํ๋ผ๋ฏธํฐ ๊ด๋ จํ ์ฌ๋ฌ๊ฐ์ง ๋ถ๋ถ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
httpServletRequest.getParameter() ์๋์์ค์ฒ๋ผ HttpServletRequest์ getParameter() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
@RequestMapping("/") public String home(HttpServletRequest httpServletRequest) { String id = httpServletRequest.getParameter("id"); return "home"; } @RequestParam ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ @RequestParam ์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํ๋ผ๋ฏธํฐ๊ฐ์ ๊ฐ์ ธ์ฌ์ ์๋ค. ์ฐ์ , ํด๋น ์ด๋
ธํ
์ด์
์ ์ต์
๊ฐ๋ค์ ๋ํด ๊ฐ๋ตํ๊ฒ ํ์ธํ๊ณ ๋์ด๊ฐ๋๊ฒ ์ข์๋ฏ ์ถ๋ค. API๋ฌธ์ 4.3.6 ๊ธฐ์ค
์ด๋ฆ ํ์
์ค๋ช
name, value (Alias for name) String ํ๋ผ๋ฏธํฐ ์ด๋ฆ required boolean ํด๋น ํ๋ผ๋ฏธํฐ๊ฐ ๋ฐ๋์ ํ์์ธ์ง ์ฌ๋ถ, ๊ธฐ๋ณธ๊ฐ์ true defaultValue String ํด๋น ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ณธ๊ฐ ์ ์ต์
๊ฐ๋ค์ ์กฐํฉํ์ฌ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ์ ์ฉํด๋ณด๋ฉด ์๋ ์์ค์ ๊ฐ์ด ๋ง๋ค์ด์ง๊ณ , ์ด๋ ๊ฒ reqeust์์ ํ๋ผ๋ฏธํฐ๊ฐ์ ๊ฐ์ ธ์ฌ์ ์๋ค.
@RequestMapping("/") public String home(@RequestParam(value="id", defaultValue="false") String id) { return "home"; } ์ด ์ด๋
ธํ
์ด์
์ ์ด์ฉํ๊ฒ๋๋ฉด ์์นซ ์๋ชปํ๋ค๊ฐ ์๋ฌ๋ฅผ ๋ง๋ ์๊ฐ ์๋๋ฐ required๊ฐ์ true๋ก ํด๋๊ณ (ํ์ ํ๋ผ๋ฏธํฐ ์ค์ ) ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด HTTP 400 ์๋ฌ๋ฅผ ๋ฐ๊ฒ ๋๋ ๊ฐ ์ต์
๋ค์ ์ ํํ ํ์ธํ๊ณ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋์์ ํด๋น ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์๋ ์ฝ๋์ฒ๋ผ ๋ฐ๋ก ๋ฐ์์ ์๋ค. ์ด๋ ๊ฒ ๋ฐ๋ก ๋ฐ์ ๊ฒฝ์ฐ๋ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ์ด false๋ก ์ค์ ์ด ๋๊ณ ๋ณ์๋ช
๊ณผ ๋์ผํ ํ๋ผ๋ฏธํฐ๋ง ๋ฐ์์ ์๊ฒ ๋๋ฉฐ ๊ธฐ๋ณธ๊ฐ ์ค์ ์ ํ ์๋ ์๋ค. ๋ฐฉ๋ฒ์ ์ฐจ์ด๋ผ์ ์ํฉ์ ๋ฐ๋ผ ๋ง์ถฐ ์ฌ์ฉํ๋ฉด ๋ ๋ฏ ํ๋ค.
@RequestMapping("/") public String home(String id) { return "home"; } @RequestBody @RequestBody์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ POSTํ์์ผ๋ก ์๋ต์ ๋ฐ๋ ๊ตฌ์กฐ์ฌ์ผ๋ง ํ๋ค. ์ด๋ฅผํ
๋ฉด JSON ์ด๋ XML๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ messageConverter๋ก ์ฝ์๋ ์ฌ์ฉํ๊ฑฐ๋, POJOํํ์ ๋ฐ์ดํฐ ์ ์ฒด๋ก ๋ฐ์๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. ๋จ, ์ด ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ ๋ณ๋์ ์ถ๊ฐ ์ค์ (POJO ์ get/set ์ด๋ json/xml ๋ฑ์ messageConverter ๋ฑ)์ ํด์ค์ผ ์ ์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์๊ฐ ์๋ค.
@PostMapping("/") public String home(@ReqeustBody Student student) { return "home"; } @ModelAttribute @RequestParam๊ณผ ๋น์ทํ๋ฐ 1:1๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์๊ฒฝ์ฐ๋ @RequestParam๋ฅผ ์ฌ์ฉํ๊ณ , ๋๋ฉ์ธ์ด๋ ์ค๋ธ์ ํธ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ๋ @ModelAttribute์ผ๋ก ๋ฐ์์ ์๋ค. ๋ํ ์ด ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด ๊ฒ์ฆ(Validation)์์
์ ์ถ๊ฐ๋ก ํ ์ ์๋๋ฐ ์๋ก๋ค์ด null์ด๋ผ๋์ง, ๊ฐ ๋ฉค๋ฒ๋ณ์๋ง๋ค valid์ต์
์ ์ค์๊ฐ ์๊ณ ์ฌ๊ธฐ์ ์๋ฌ๊ฐ ๋ ๊ฒฝ์ฐ BindException ์ด ๋ฐ์ํ๋ค.
Spring command ๊ฐ์ฒด ์ปจํธ๋กค๋ฌ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ๋ณด์ ๋ํด์๋ view ์์ ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์๋ก ๋ค์ด ์๋๊ทธ๋ฆผ์ฒ๋ผ ์ด๋ ๊ฒ ์ปจํธ๋กค๋ฌ๊ฐ ๊ตฌ์ฑ๋์ด์๊ณ
์ด๋ ๊ฒ ๋ชจ๋ธ์ด ๊ตฌ์ฑ๋์ด์์๋
view ์์ ์ด๋ฐ์์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด๋ /student?name=taetaetae&age=32&address=green-factory๋ก ํธ์ถ์ ํด๋ณด๋ฉด ๊ตฌ์ง Model์ ๊ฐ์ ์
ํ
ํด์ฃผ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ณด๋ฅผ ์ฝ์์ ์๊ฒ ๋๋ค.
๋ง์น๋ฉฐ ์คํ๋ง์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์๋นํ ๋ค์ํ๋ค. ์ด๊ฒ ์ ๋ต์ด๋ค ์ ์ํ ์ ์์์ ๋๋ก. ์ํฉ์ ๋ฐ๋ผ ๋ง๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ผ ํ๊ฒ ๊ณ , ๊ฐ ๋ฐฉ๋ฒ์ ์ฅ/๋จ์ ์ ์ต๋ํ ์ด๋ ค์ ์ข๋ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด์ผ ํ๊ฒ ๋ค.

๋ฒ์จ 3์์ด๋ค. ๋ญํ๋ ์ ๋๋ก ํ๊ฒ๋ ์๋๋ฐ ์๊ฐ์ ์ผ์ํ๊ฒ๋ ๋ฉ์ถ์ง ์๊ณ ์ง๋๊ฐ๊ณ ์๋ค. ์ค๋๋ง์ ๋๊ธฐํ์ ๋ง๋ฌ๋ค. ์ ์
์ฌ์์ด ๋๊ธฐ ์ ์ฐ์ต์(?)์์ ๋๊ฑฐ๋๋ฝํ๋ฉฐ ๊ฐ๋ฐ์ ๋ํด ๊ณ ๊ตฐ๋ถํฌ ํ๋ ์ฌ์ด์ธ์ง๋ผ. ์ค๋๋ง์ ๋ง๋๋ ์๋ก ์ด์ผ๊ธฐ ํ๊ณ ์ ํ๋ ์ฃผ์ ๋ ์ธ์ ๋ ๋์ผํ๋ค. ๊ฐ๋ฐ์๋ก์์ ์ถ ์ด๋ฐ์ ๋ฐ ์ด์ผ๊ธฐ๋ฅผ ํ๋ฉฐ ๋ค์ ๋๋ฅผ ๋์๋ณด๊ฒ ๋์๋ค. ๋ด ๋
ธ๋ ฅ์ ์ํด, ์๋๋ฉด ์ด์ด ์ข์ ์ง๊ธ ๋ค๋๊ณ ์๋ ํ์ฌ์ ๋ค์ด์จ ์ดํ๋ก ์์ ๋งํผ์ ์ด์ ์ ์จ๋ฐ๊ฐ๋ฐ ์์ผ๋ฉฐ, ๊ทธ๋งํผ ๊ฐ์ ํ์ง๋ ์๊ณ ์น์ดํ์ง๋ ์๋ ๋ด ์์ ์ด ๋๋ฌด ๋ฏธ์ํ๊ณ ์ชฝํ๋ฆด์ ๋๋ก ํ์ฌํ๊ธฐ ๊ทธ์ง ์์๋ค. ๋ฌด์๋๋ฌธ์ผ๊น, ๋๋์ฒด ์ ์ด๋ ๊ฒ ์์ผํด์ก๊ณ ์ ๊ทน์ ์ด์ง ๋ชปํ๊ฒ ๋์์๊น. ๊ทธ ์ง๋ฌธ์ ๋ํ ์ ๋ต์ ์ด๊ฒ์ด๋ค ๋ผ๊ณ ์ ์๋ฅผ ํ ์๋ ์๊ฒ ์ง๋ง ํ์คํ๊ฑด, ํ์ฌ ๋ด ์ํฉ์ ์์ฃผํ๊ณ ํํํ๋ คํ๋ ๋ง์๊ฐ์ง์ด ์๊ฒผ๋ค๋๊ฑด ํํผํ ์ ์์์ ๋๋ก ๋๋ ์ ๋ง ๋ง์ด ๋ณํด๋ฒ๋ฆฐ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์ง๊ธ ์ํฉ์ด ์๋ชป๋์๋ค๋๊ฑด ์๋์ง๋ง ๋ด ์ง์
ํน์ฑ์ ๋์์์ด ๋
ธ๋ ฅํ๊ณ ๋์ ํ๋ฉฐ ๋ฐฐ์์ผ ํ๋ ์ํฉ์ธ๋ฐ ์ง๊ธ ๋ ํด๊ทผํ๊ณ ์ง์๊ฐ๋ฉด ์ฌ๊ณ ์ถ๊ณ ์๊ธฐ ๋ฐ์๊ณ ๋ค์๋ ๋ฆ์ ์๊ณ … ๊ณ์๋ ์ํํจํด์ ์ ์ด ์ฌ๋๊ฒ ๊ฐ๋ค. ์ผ๋จ ๋
์์ข ๋ง์ด ํด์ผ๊ฒ๋ค. ํ์ฌ์, ์ง์ ์์ธ ์ฑ
๋ง ๋ฒ์จ ๋ช๊ถ์ธ์ง… ๊ธฐ๋ณธ์ด ๋๋ ์ ๊ณต์์ ํ๋ ์ ํ๊ณ ๋๊น์ง ์๋
ํด๋ณด์. ๊ทธ๊ฒ ์๋ฐ๋ ์คํ๋ง์ด๋ , ์ต์ ์ ๊ธฐ์ ๋ณด๋ค ๊ธฐ๋ณธ์ด ํํํด์ ธ์ผ ํ๋๊ฑด ๋ฐฑ๋ฒ ์ฒ๋ฒ ๋งํด๋ ๋น์ฐํ๊ธฐ์.
๋ค์ ์ ์ ์ฐจ๋ฆฌ์. ์ค๋ ๊ฑท์ง ์์ผ๋ฉด ๋ด์ผ์ ๋ฌ๋ ค์ผ ํ๋ค๊ณ ๋๊ตฐ๊ฐ ๊ทธ๋ฌ๋ฏ..

github ์์๋ ๋ ํ์งํ ๋ฆฌ์ ์ ๋ฐ์ ์ธ ์ํฉ์ ๋ํด ๋ค์ํ API๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ์๋ค. ์ด๋ฒ์๋ ๊ทธ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
Personal access tokens ๋ฐ๊ธ ์ฐ์ ์ ์์ ์ธ API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Personal access tokens๋ฅผ ๋ฐ๊ธ๋ฐ์์ผ ํ๋ค. github ์ด๊ธฐํ๋ฉด > ์ฐ์ธก์๋จ ํ๋กํ์ฌ์ง ํด๋ฆญ > setting > Personal access tokens ์ ๋ค์ด๊ฐ ํ ํฐ์ ์์ฑ์ ํ๋ค. ํด๋น ํ ํฐ์ ํ์ฉ๋ฒ์๋ฅผ ์ค์ ํ๋ค ์์ฑ์ ํ๋ฉด ๋ง๋ค์ด ์ง๋๋ฐ ์ฌ๊ธฐ์ ๋ฐ๊ธ๋๋ ๋ฌธ์์ด์ ๋ฐ๋ก ๋ณด๊ดํ๋๊ฒ ์ข๋ค. (๋์ค์ ๋ค์ ํ์ธํ๋ ค๋ฉด ์๋ก ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ง๊ณ ๋ ์๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ง๋ค๋ ๋ฉ๋ชจํด ๋๋๊ฒ ์ข๋ค.) ์๋์ ๊ฐ์ด ์์ฑ์๋ฃ.
API ์ฌ์ฉ๋ฐฉ๋ฒ ๊ถํ์ด ์๋ Repository ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ฏ์ด github์์ ์ ๊ณตํ๋ API๋ํ ๊ถํ์ด ์๋ Repository์ ๋ํด์๋ง API๋ฅผ ์ ๊ณตํ๋ค. ์์์ ๋ฐ๊ธํ token ์ ๊ถํ ์ฒดํฌํ ๋ ์ฌ์ฉํ๋๋ฐ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์์ ์๊ฒ ์ผ๋ ๋๋ ๊ฐ๋จํ๊ฒ ํค๋์ ํฌํจ์์ผ์ ์ผ๋ฐ GET ํธ์ถ์ ํ๋ ๋ฐฉ์์ผ๋ก ํ์๋ค. ์๋์ฐ ํ๊ฒฝ์์๋ ํค๋ ์
ํ
ํ๊ณ ํธ์ถํ๋๊ฒ ์กฐ๊ธ ์ด๋ ค์ธ์ ์์ผ๋ ์ด๋ฌํ ๋ถ๋ถ์ ์ค์ ํ ์ ์๋ Postman์ด๋ผ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ํธ์ถ์ ํด๋ณธ๋ค. ์๋์ฒ๋ผ url์ https://api.github.com/์ผ๋ก ์ค์ ํ๊ณ Headersํ๋ผ๋ฏธํฐ์ Authorization๋ผ๋ key์ value๋ฅผ ์์์ ๋ฐ๊ธ๋ฐ์๋ token์ ์ด์ฉํ์ฌ token abcd~~์์ผ๋ก ์
๋ ฅํด์ค๋ค์ send๋ฒํผ์ ๋๋ฌ์ฃผ๋ฉด ์๋ต์ ๋ฐ์์๊ฐ ์๋๋ฐ, ์๋ ๊ทธ๋ฆผ์ ์ ๊ณตํ๋ api์ ๋ชจ๋ url์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋์ ์๋ ์์์ ํ์ธ๋ api url์ ํ์ฉํ์ฌ ๋ด๊ฐ ๊ถํ์ด ์๋ ๋ ํ์งํ ๋ฆฌ ๋ด์์ ํ์ธํ ์์๋ ์ ๋ณด์ ๋ํ API๋ฅผ ํธ์ถํด๋ณด์๋ค.
API ํธ์ถ์ ๊ฐ์ฅ ๋ณดํธํ๋์ด์๋(?) ์คํฉ์ธ JSON์ผ๋ก ์๋ต์ด ๋ด๋ ค์ค๊ธฐ๋๋ฌธ์ ์ด๋ ํ ํ๊ฒฝ์์๋ ์ถฉ๋ถํ ํ์ฉํ ์ ์์๊ฒ์ด๋ผ ์๊ฐํ๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ํ ๋ด์์ ํ๋์ Organizations๋ด์ ์ฌ๋ฌ Repository๊ฐ ์๋๋ฐ ๊ฐ๊ฐ์ PullRequest์ ๋ํด ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํด์ผํ๋ ์ํฉ์์ ์ผ์ผํ ๋ค ์ฐพ์๋ณด๊ธฐ ๊ท์ฐฎ์ github-api๋ฅผ ํ์ฉํด open๋ PullRequest๊ฐ ์์ผ๋ฉด ์๋ฆผ์ ์ฃผ๋ ๊ฑธ ๋ง๋ค์ด ๋ณด์๋ค.

๋ฆฌ๋
์ค ์์์ jsonํํ์ String ์ ํ์ฑํด์ผํ๋ ์ํฉ์ด๋ผ๋ฉด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด๋๊ฒ์ ์ถ์ฒํด๋ณธ๋ค.
jq ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋๋ฌด๋๋ฌด ๊ฐ๋จํ๋ค.
์์ ์ ์์คํ
์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๊ณ (32-bit system) $ wget http://stedolan.github.io/jq/download/linux32/jq (64-bit system) $ wget http://stedolan.github.io/jq/download/linux64/jq ์คํ ๊ถํ์ ์ค์ ํด ์ค ๋ค chmod +x ./jq root ๊ถํ์ผ๋ก ํด๋น ํ์ผ์ ์ด๋์ํจ๋ค. sudo cp jq /usr/bin ์คํ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค. Json String ์ด ์๋์ ๊ฐ์ด ์๋ค๊ณ ๊ฐ์ ํ์๋ { "name": "Google", "location": { "street": "1600 Amphitheatre Parkway", "city": "Mountain View", "state": "California", "country": "US" }, "employees": [ { "name": "Michael", "division": "Engineering" }, { "name": "Laura", "division": "HR" }, { "name": "Elise", "division": "Marketing" } ] } ์ค์ ์ฌ์ฉ๊ณผ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด ์ง๋ค.
$ cat json.txt | jq '.name' "Google" $ cat json.txt | jq '.location.city' "Mountain View" $ cat json.txt | jq '.employees[0].name' "Michael" $ cat json.txt | jq '.location | {street, city}' { "city": "Mountain View", "street": "1600 Amphitheatre Parkway" } ๋ณด๋ค ์์ธํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๊ณต์ํํ์ด์ง( https://stedolan.github.io/jq/ )๋ฅผ ์ฐธ์กฐํ๋ฉด ์ข์๋ฏ ํ๋ค.

Spring ํ๊ฒฝ์์ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด pom.xml ์ ์ด๋ฐ์ ๋ฐ ์ค์ ๋ค์ ์ ์ด์ค์ผ ํ๋ค. ํ์ง๋ง ์ด๋ฐ ์๊ณ (?)๋ฅผ ๋์ด์ค์ ์๋ ๋ฐฉ๋ฒ์ค์ ํ๊ฐ์ง๊ฐ ๋ฐ๋ก Spring Boot๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ธ๋ฐ, ์ดํด๋ฆฝ์ค ํ๊ฒฝ์์ ๋ง๋๋ ๋ฒ์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
new > Maven Project ๋น Maven Project ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํ๋ ์๋ตํ๊ณ … ๋ง๋ค๊ฒ ๋๋ฉด pom.xml ์ ์๋์ฒ๋ผ ์์ฃผ ๊น๋ํ(?)์ํ๋ก ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>boot</artifactId> <version>0.0.1-SNAPSHOT</version> </project> ๊ทธ๋ฌ๋ฉด ์ด ๋น์ด์๋ pom.xml ์ Spring-Boot ์ ํ์ํ ์ค์ ๋ค์ ์ถ๊ฐํด์ฃผ๊ธฐ๋ก ํ๋ค.
<parent> <!--boot์ ์คํํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ๋ช
์์ ์ผ๋ก ์ค์ --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <!--boot์์ ์คํํฐํจํค์ง๋ก ์ ๊ณตํด์ฃผ๋ ๊ฒ๋ค์ค์ web ์ค์ ๋ถ๋ถ --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ๊ทธ๋ค์ ์์์ java ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ์๋์ฒ๋ผ ์ค์ ํ๋ฉด ๋
@SpringBootApplication // @Configuration + @EnableAutoConfiguration + @ComponentScan ๋ค์ ์ข
ํฉ ์ด๋
ธํ
์ด์
public class TestApplication{ public static void main(String[] args) throws Exception { SpringApplication.run(TestApplication.class, args); } } Spring Boot ์์๋ ๋ด์ฅWAS๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ main ๋ฉ์๋์์ ์ฐํด๋ฆญํ run AS โ Spring Boot App ์ ์ ํํด์ฃผ๋ฉด 8080ํฌํธ๋ก ๋์์ง๊ฒ ๋๋ค.
new > Spring Starter project (STS๊ฐ ์ค์น๋์ด์๋ค๋ ๊ฐ์ ํ์)์ด ๋ฉ๋ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ํ๋ ์ผ๋ จ์ ์ค์ ๋ค์ ์๋์ผ๋ก ํด์ฃผ๊ฒ ๋๋ค. ๊ฐ๋จํ ๋ด์ฉ์ด๋ next๋ฅผ ํด์ฃผ๋ค ๋ง์ง๋ง์ Dependencies ์ค์ ํ๋ ๋ถ๋ถ์์ Web ์ ์ฒดํฌํด์ฃผ๊ณ Finish ๋ฒํผ์ ๋๋ฅด๋ฉด ๋
Spring Initializr (start.spring.io) http://start.spring.io/ ์ ๋ค์ด๊ฐ๋ณด๋ฉด ๊ตฌ์ง ์ค๋ช
ํ์ง ์์๋ ์น์ ํ๊ฒ Generate ํด์ฃผ๋ ํ์ด์ง๊ฐ ๋ณด์ธ๋ค. ์ฌ๊ธฐ์ web ์ Dependencies์ ์ถ๊ฐํ๊ณ Generate๋ฅผ ํ๋ฉด ํด๋น ํ๋ก์ ํธ๊ฐ ์์ถ๋ ์ํ๋ก ๋ค์ด์ด ๋ฐ์์ง๊ฒ ๋๊ณ ์ด๋ฅผ IDE ์์ ์ด์ด๋ณด๋ฉด ์์์ ํ๋ ์ผ๋ จ์ ๊ณผ์ ๋ค์ด ์ค์ ๋์ด ์๋๊ฒ์ ํ์ธํด๋ณผ์๊ฐ ์๋ค.
๋ด์ฅํฐ์ผ์ ์ฌ์ฉ์ํ๊ณ ๋ณ๋ ํฐ์ผ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ Spring boot๋ ์์ฒด์ ์ผ๋ก ๋ด์ฅ WAS๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ์ง๋ง ๊ด๋ฆฌํฌ์ธํธ๋ ์ด๋ฐ์ ๋ฐ ์ด์ ๋ก ๋ด์ฅํฐ์ผ์ ์ฌ์ฉํ์ง ๋ชปํ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ํด์ฃผ๋ฉด ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ฐ ๋๋ฉด jar๋ก ๋ง๋ค์ด ์งํ
๋ฐ war๋ก ๋น๋ ๋๋๋ก ์์ ์ ํด์ผํ๋ค. (was๊ฐ WAR๋ฅผ ๋ฌผ๊ณ ๋ ์ผํ๊ธฐ ๋๋ฌธ..) <packaging>war</packaging> dependency ์ tomcat์ ์ถ๊ฐํด์ค๋ค. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> ์๋์ฒ๋ผ main ๋ฉ์๋๊ฐ ์๋ ํด๋์ค์ SpringBootServletInitializer๋ฅผ ์์๋ฐ๊ฒ ํ ํ configure๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ค๋ค. @SpringBootApplication public class TestApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(TestApplication.class); } public static void main(String[] args) throws Exception { SpringApplication.run(TestApplication.class, args); } } ํฐ์ผ์ ๋์ฐ๊ธฐ ์ํ์ฌ ํ๋ก์ ํธ ์ค์ (Project Facets)์์ Dynamic Web Module์ ์ฒดํฌํด์ค๋ค. ์ฐธ๊ณ URL
http://www.donnert.net/86 http://opennote46.tistory.com/124

์ผ๋ฐ์ ์ผ๋ก ์๋ฐ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด Model ์ ๋ง๋ค๊ณ ๊ฐ ๋ฉค๋ฒ๋ณ์๋ฅผ ์ ๊ทผํ ์ ์๋ (๊ฐ ์์๋ค์ด private ์ ๊ทผ๊ถํ์ ๊ฐ์ง๊ณ ์์๋) method ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. IDE์์ ์ ๊ณตํ๋ ์๋์ฒ๋ผ… (์๋์ฐ/์ดํด๋ฆฝ์ค ๊ธฐ์ค) get/set ๋ฉ์๋ : Alt + Shift + S + R toString ๋ฉ์๋ : Alt + Shift + S + S ๊ธฐํ ๋ฑ๋ฑ… public class Student { private int id; private String name; private int grade; private String department; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", grade=" + grade + ", department=" + department + "]"; } } ์ด๋ ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ด๋
ธํ
์ด์
์ค์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ๊ฐ๋จํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฐํ๊ณ ์ ํ๋ค. ๋ฐ๋ก lombok, ๊ณต์ ํํ์ด์ง : https://projectlombok.org ์ค์น ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํ๋ค. ๊ณต์ ํํ์ด์ง์์ jar๋ฅผ ๋ค์ด๋ฐ๊ณ ์คํ, ์๋์ฒ๋ผ ์ดํด๋ฆฝ์ค ์คํํ์ผ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ค๋ค์์ ์ธ์คํจ์ ๋๋ฅด๋ฉด ๋๋ค. maven ํ๊ฒฝ์์ dependency๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ๋น์ฐํ ์ถ๊ฐ์ค์ ์ ํด์ค์ผ ํ๋ค.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> <!--๋ฒ์ ์ ๊ทธ๋ ๋ง์ถฐ์--> </dependency> ์ค์ ๋ก ์ฝ๋์์์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ ๋ง ๊ฐ๋จํ, ์ด๋
ธํ
์ด์
๋ง ์ ์ฉํด์ฃผ๋ฉด ๋!
import lombok.Data; @Data public class Student { private int id; private String name; private int grade; private String department; } ๊ทธ๋ผ ์ด๋ ๊ฒ ๊ธฐ๋ณธ์ ์ธ method๋ค์ด ์์ฑ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก @Data๋ฅผ ์ฌ์ฉํ๊ณ ์ํฉ์ ๋ฐ๋ผ ํ์ํ ์ด๋
ธํ
์ด์
๋ง ์ง์ ๋ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
@Getter and @Setter @NonNull @ToString @EqualsAndHashCode @Data @Cleanup @Synchronized @SneakyThrows ์ฐธ๊ณ URL : http://jnb.ociweb.com/jnb/jnbJan2010.html