관리자 페이지
2019-04-30 00:00:00 +0000관리자 추가
- 상품 페이지를 만들면서 오로지 관리자만이 상품을 등록할 수 있게 만들어야 한다
- 하나의 필드를 추가하여 0일 땐 일반유저, 1일 땐 관리자로 설정할 수 있지만 고객과 관리자의 데이터는 많이 다르므로 분리해야한다(예를들어 고객은 구매횟수나 구매금액이 필요하지만 관리자는 필요 없다)
- 유저, 관리자의 기능을 정리하여 필요한 데이터를 뽑아낸다
고객 | 쇼핑몰 관리자 | |
---|---|---|
정의 | 상품을 구매하는 고객을 의미한다 | 쇼핑몰 운영자를 의미한다(개발자 x) QA와 테스터와도 구분된다 |
기능1 | 상품 조회 | 상품 조회 |
기능2 | 상품 구매 및 장바구니 | 상품 관리 |
기능3 | 상품 결제 | 고객 관리 |
기능4 | - | 주문 조회 및 관리 |
기능5 | - | 게시판 관리 |
- 표를 바탕으로 유저와 관리자의 데이터를 정의한다
- 너무 기능이 많으므로 장바구니, 결제 기능은 제외, 관리자도 주문, 게시판 기능은 제외하고 정의
- 유저는 총 구매 금액 , 한달 구매 금액 , 구매 등급 , 가입일 , 마지막 구매일
- 관리는 상품 보기/관리 권한, 고객 보기/관리 권한
-
정리된 데이터를 바탕으로 테이블을 정의한다
- 고객 테이블(Customer)
필드명 | 데이터형 | 설명 |
---|---|---|
user_seq | bigint | 유저 id |
total_price | bigint | 총 구매 금액 |
total_month_price | bigint | 이번달 구매 금액 |
price_grade | tinyint | 구매 등급 |
join_date | timestamp | 가입일 |
last_buy_date | timestamp | 마지막 구매일 |
- 관리자 테이블(Admin)
필드명 | 데이터형 | 설명 |
---|---|---|
user_seq | bigint | 유저 id |
product_view_author | tinyint(1) | 상품 조회 권한 |
product_update_author | tinyint(1) | 상품 관리 권한 |
customer_view_author | tinyint(1) | 고객 조회 권한 |
customer_update_author | tinyint(1) | 고객 관리 권한 |
- 데이터를 바탕으로 테이블 생성 쿼리를 작성한다
- 고객 테이블
CREATE TABLE `customer` (
`user_seq` bigint NOT NULL,
`total_price` bigint DEFAULT 0,
`total_month_price` bigint DEFAULT 0,
`price_grade` tinyint DEFAULT 0,
`join_date` timestamp NULL DEFAULT NOW(),
`last_buy_date` timestamp,
PRIMARY KEY (`user_seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 관리자 테이블
CREATE TABLE `admin`(
`user_seq` bigint NOT NULL,
`product_view_author` tinyint(1) DEFAULT 0,
`product_update_author` tinyint(1) DEFAULT 0,
`customer_view_author` tinyint(1) DEFAULT 0,
`customer_update_author` tinyint(1) DEFAULT 0,
PRIMARY KEY (`user_seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 일반 고객과 관리자를 구분짓는 플래그를 user에 추가한다
ALTER TABLE USER ADD ADMIN TINYINT(1) DEFAULT 0;
- 관리자로 만들 유저는 ADMIN 필드 값을 1로 준다
- ADMIN에 해당 유저 정보를 추가한다
- 유저의 정보를 가져오는 쿼리에 admin 필드를 가져오도록 한다
INSERT INTO admin(user_seq, product_view_author, product_update_author, customer_view_author, customer_update_author) VALUES(12, 1, 1, 1, 1);
페이지 정의
- 관리자의 기능을 바탕으로 페이지를 정의 한다
- 페이지는 2개. 상품 보기,관리 페이지, 회원 보기, 관리 페이지
- 상품은 조회, 추가, 삭제, 수정 기능이 기본적으로 들어가야 한다(페이징, 검색은 나중에)
- 회원은 조회, 추가, 수정 기능이 기본적으로 들어간다(페이징, 검색은 나중에)
- 아래와 같은 url을 정의 한다(이전에 정의했지만 재정의 해야한다. 관리자 페이지를 따로 만들므로)
url | 설명 | Method |
---|---|---|
/admin/product/list | 상품 리스트 보기 | GET |
/admin/product/{seq} | 상품이 있는지 체크 | POST |
/admin/product/{seq} | 상품 상세 보기 | GET |
/admin/product/post | 작성할 수 있는 권한이 있는지 체크 | POST |
/admin/product/post | 새로운 상품 등록 페이지 이동 | GET |
/admin/product/post | 새로운 상품 등록 | POST |
/admin/product/post/{seq} | 작성할 수 있는 권한이 있는지 체크 | GET |
/admin/product/post/{seq} | 기존에 있는 상품 페이지 이동 | POST |
/admin/product/post/{seq} | 기존에 있는 상품 수정 | PUT |
/admin/product/delete | 상품 삭제 | GET |
url | 설명 | Method |
---|---|---|
/admin/user/list | 고객 조회 | GET |
/admin/user/{seq} | 고객이 있는지 체크 | POST |
/admin/user/{seq} | 고객 상세 보기 | GET |
/admin/user/post | 고객 추가 체크 | POST |
/admin/user/post | 고객 추가 이동 | GET |
/admin/user/post | 고객 추가 | PUT |
/admin/user/post/{seq} | 고객 정보 수정 체크 | POST |
/admin/user/post/{seq} | 고객 정보 수정 페이지 이동 | GET |
/admin/user/post/{seq} | 고객 정보 수정 | PUT |
/admin/user/delete | 고객 정보 삭제 | GET |
고객, 관리자 VO, Service, DAO, xml 생성
- 고객. 관리자 페이지의 고객 정보와 관련 있다.
- Service, DAO, xml 파일도 생성한다
import java.util.Date;
import lombok.Data;
@Data
public class CustomerVO{
private Long userSeq;
private Long totalPrice;
private Long totalMonthPrice;
private Byte priceGrade;
private Date joinDate;
private Date lastBuyDate;
}
- 관리자. 관리자의 권한과 관련 있다
import lombok.Data;
@Data
public class AdminVO{
private Long userSeq;
private boolean productViewAuthor;
private boolean productUpdateAuthor;
private boolean customerViewAuthor;
private boolean customerUpdateAuthor;
}
관리자 화면 추가
- 일반 고객과 관리자가 보는 화면이 다르다.
- userVO객체의 admin 값이 true일 때 관리자 메뉴가 보이도록 수정한다
<c:choose>
<c:when test="${true eq userVO.admin}">
<div class="col-md-3 col-xs-3">
<a href="#">상품 관리</a>
</div>
<div class="col-md-3 col-xs-3">
<a href="#">고객 관리</a>
</div>
<div class="dropdown col-md-3 col-xs-3">주문 관리</div>
<div class="col-md-3 col-xs-3">게시판 관리</div>
</c:when>
<c:otherwise>
<div class="col-md-3 col-xs-3">
<a href="/main">메인화면</a>
</div>
<div class="col-md-3 col-xs-3">공지사항</div>
<div class="dropdown col-md-3 col-xs-3">
<div class="dropbtn">전체상품</div>
<div class="dropdown-content">
<a href="/product/list">디저트</a> <a href="/product/list">이유식</a>
</div>
</div>
<div class="col-md-3 col-xs-3">
<a href="/board/list?page=1&count=10">자유게시판</a>
</div>
</c:otherwise>
</c:choose>
상품 관리
- 상품 리스트 가져오기
- 상품 재고 필드 추가 및 VO, 쿼리 수정, 제품 pic 필드 -> img로 변경
alter table product add stock Long Default 0;
alter table product change pic img varchar(50)
- 메뉴에서 관리자 상품관리 페이지로 이동되도록 수정(관리자 상품관리, 상세페이지, 추가, 수정 페이지를 만든다)
MappingJackson2JsonView
2019-04-30 00:00:00 +0000MappingJackson2JsonView
View Resolver
- 클라이언트의 요청을 받은 결과값으로 View이름을 전달한다. 이 View이름으로 ViewObject를 찾아서 전달할 View 내용을 생성한다
- View 이름을 전달하면서 데이터도 같이 전달하게 된다. 이 때 ajax를 사용 중이라면 값을 전달할 때 마다 일일이 json으로 바꿔야 한다
- MappingJaxkson2JsonView를 사용하면 간단하게 전달할 수 있다.
사용법
- pom.xml에서 jackson 라이브러리 사용
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
- ServletContext에 MappingJackson2JsonView 객체를 jsonView라는 이름으로 bean 등록
- MappingJackson2JsonView를 사용하면 ModelAndView가 json형식으로 변한다 => 일일이 json 변환하지 않아도 됨
@Bean(name="jsonView")
public View mappingJacksonJsonView(){
return new MappingJackson2JsonView();
}
- 사용 방법
@RequestMapping(value = "/post/{seq}", method = RequestMethod.DELETE)
public String delete(@PathVariable("seq") Long seq, Model model, HttpSession session) throws Exception {
BoardVO boardVO = service.getBoardVO(seq);
UserVO userVO = (UserVO) session.getAttribute("userVO");
checkUserNull(userVO);
ResultMap resultMap = service.deleteVO(seq, userVO, boardVO);
model.addAllAttributes(resultMap);
return"jsonView"
}
Spring Javaconfig
2019-04-29 00:00:00 +0000Java Configuration
- xml 대신 java로 root, servlet 설정을 함(xml 대신 java로 설정이 느는 추세)
- 아래 예제는 ‘코드로 배우는 스프링 웹 프로젝트’ 책 예제를 정리한 내용
Java Configuration 방법
- 프로젝트를 생성한다. 임의로 ex.config.test로 지정하였다
- pom.xml 설정 ~~~
- webapp/resources/spring 아래에 있는 xml 설정파일을 삭제한다
- ex.config.config 패키지를 생성한다. 그리고 RootConfig.java 를 만들고 아래와 같이 코드를 작성
- xml 설정 파일 대신 ex.config.sample 에 있는 클래스를 bean으로 등록
package ex.config.config;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;
@Configuration @ComponentScan(basePackages= {“ex.config.sample”}) public class RootConfig {
}
- Webconfig.xml
package ex.config.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class>[] getRootConfigClasses() { return new Class[]{RootConfig.class}; } @Override protected Class>[] getServletConfigClasses() { // TODO Auto-generated method stub return null; } @Override protected String[] getServletMappings() { // TODO Auto-generated method stub return null; } }
- ex.config.sample 패키지를 만들고 bean 등록할 class를 생성한다
- Chef.java
package ex.config.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component @Data public class Chef {
}
- Restaurant.java
package ex.config.sample;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;
import lombok.Data; import lombok.Setter;
@Component @Data public class Restaurant {
@Setter(onMethod_ = @Autowired)
private Chef chef;
}
- test 폴더에 ex.config.test 패키지 생성. 그리고 junit으로 Test할 JUnitCase 생성
package ex.config.test; import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import ex.config.config.RootConfig; import ex.config.sample.Restaurant; import lombok.Setter; import lombok.extern.log4j.Log4j; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {RootConfig.class}) @Log4j public class SampleTests {
@Setter(onMethod_ = @Autowired)
private Restaurant restaurant;
@Test
public void testExist() {
assertNotNull(restaurant);
log.info(restaurant);
log.info("-----------------------------------------");
log.info(restaurant.getChef());
} } ~~~
게시판 만들기-제품 등록
2019-04-29 00:00:00 +0000상품 등록2
- 임의의 데이터를 출력하는 것 까지 완료
- 이제 상품 등록을 페이지에서 하는 기능을 추가 필요
- 이미지는 upload기능이 들어가므로 나중에 구현한다
- 유저, 관리자가 나뉘어져 있지 않도록 권한 체크와 관리자 페이지는 등록 다음으로 구현한다
Controller, Service, Query 처리
- 상품 생성 날짜가 필요하여서 생성 날짜 필드를 추가하였다
Alter table product Add create_date Timestamp DEFAULT NOW() NOT NULL;
- 상품을 등록하는 쿼리문을 만든다
<insert id="createProductVO" parameterType="ProductVO">
INSERT INTO product
(
category
, pic
, title
, price
, text
, user_seq
)
VALUES
(
#{category}
,#{pic}
,#{title}
,#{price}
,#{text}
,#{userSeq}
,#{userSeq}
)
</insert>
- Service에서는 상품의 값이 올바르게 들어갔는지 체크하고 쿼리문을 호출한다
@Override
public ResultMap createProduct(ProductVO productVO) throws Exception{
int category = productVO.getCategory();
String picSrc = productVO.getPic();
String title = productVO.getTitle();
Long price = productVO.getPrice();
String text = productVO.getText();
if(title == null || text == null || picSrc == null) {
throw new LogicException("990", "알 수 없는 에러가 발생했습니다");
}
if(title.isEmpty()) {
throw new LogicException("1000", "상품명을 입력해주세요");
}
if(TITLE_SIZE_MAX < title.length()) {
throw new LogicException("1001", "상품명이 너무 깁니다");
}
// 이미지 체크
if(0 >= price) {
throw new LogicException("1004", "가격은 1원 이상이여야 합니다");
}
if(PRICE_SIZE_MAX <= price) {
throw new LogicException("1006", "가격은 1,000,000,000원 이하만 입력 가능합니다");
}
if(text.isEmpty()) {
throw new LogicException("1007", "설명을 입력해주세요");
}
if(TEXT_SIZE_MAX <= text.length()) {
throw new LogicException("1008", "설명은 100자 이하여야 합니다");
}
int result = dao.createProduct(productVO);
if(0 == result) {
throw new LogicException("990", "알 수 없는 에러가 발생했습니다");
}
ResultMap resultMap = new ResultMap();
resultMap.setStatus("200");
resultMap.setMsg("");
return resultMap;
}
- Contorller에서는 /post url 을 POST, GET 방식 2가지의 방식으로 받는다
- POST 방식은 상품 등록이 가능한 권한이 있는지 체크한다
- GET 방식은 상품 등록 페이지로 이동한다
- 상품 등록 요청 url은 method를 PUT으로 받는다
- json 데이터와 ProductVO가 매핑이 되지 않는 상황 발생 => @RequestBody를 추가하니 매핑되었음
@RequestMapping(value = "/post", method = RequestMethod.POST)
public String checkPost(HttpSession session, Model model) throws Exception {
ResultMap resultMap = service.getCheckPost();
model.addAllAttributes(resultMap);
return JSON_VIEW;
}
@RequestMapping(value = "/post", method = RequestMethod.PUT)
public String postProduct(@RequestBody ProductVO productVO, HttpSession session, Model model) throws Exception {
ResultMap resultMap = service.createProduct(productVO);
model.addAllAttributes(resultMap);
return JSON_VIEW;
}
View
- ‘등록’ 버튼을 클릭하면 해당 데이터를 PUT method로 전달하고 성공할 시 list로 페이지 이동되도록 만듬
// 페이지 이동
$('#product-new-product-create').click(function(){
console.log('product-new-product-create');
ajaxRequest("/product/post", "", "POST", "location.href='/product/post'");
});
// 상품 등록
$("#product-new-add-product").click(function(){
var category = $('#product-add-select-input').val();
var title = $('#product-title-input-text').val();
var price = $('#product-price-input-text').val();
var text = $('#product-text-input-text').val();
if(category == undefined || title == undefined || price == undefined || text == undefined){
return;
}
price = price.replace(",", "");
var data ={
"category":category,
"title":title,
"price":price,
"text":text
};
ajaxRequest("/product/post", JSON.stringify(data), "PUT", "location.href='/product/list'");
});
게시판 만들기-제품 페이지 제작
2019-04-29 00:00:00 +0000제품 페이지 제작
- 마켓컬리, 쿠팡, 웹쇼핑몰 처럼 상품의 목록이 나온는 상품 페이지 제작
- 제품에 대한 정보를 뽑아내고 DB 생성및 쿼리, VO 등을 작성한다
- 카테고리 디저트는 1005, 이유식은 1006
필드명 | 데이터형 | 설명 |
---|---|---|
product_seq | bigint(20) | 상품 고유 시퀀스 |
category | bigint(20) | 상품 카테고리 |
pic | varchar(30) | 상품 사진 |
title | varchar(20) | 상품 이름 |
price | int | 상품 가격 |
text | varchar(100) | 상품 설명 |
count | bigint(20) | 조회수 |
product_del | tinyint(1) | 삭제 여부 |
user_seq | bigint(20) | 작성자 시퀀스 |
- 상품 DB 생성 쿼리문
CREATE TABLE `product` (
`PRODUCT_SEQ` bigint(20) NOT NULL AUTO_INCREMENT,
`CATEGORY` int NOT NULL,
`PIC` text DEFAULT 'img/1.jpg',
`TITLE` varchar(20) NOT NULL,
`PRICE` bigint NOT NULL DEFAULT 0,
`TEXT` varchar(100) DEFAULT '',
`COUNT` bigint(20) DEFAULT 0,
`PRODUCT_DEL` bigint(20) DEFAULT 0,
`USER_SEQ` bigint(20),
PRIMARY KEY (`PRODUCT_SEQ`)
) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8
- 임시 데이터 넣기
INSERT INTO PRODUCT(CATEGORY, TITLE, PRICE, TEXT)
VALUES(1005, '달콤유자케익', 20000, '유자를 흠뻑 넣은 케익');
INSERT INTO PRODUCT(CATEGORY, TITLE, PRICE, TEXT)
VALUES(1005, '자몽이슬톡톡', 3000, '이슬 톡톡');
INSERT INTO PRODUCT(CATEGORY, TITLE, PRICE, TEXT)
VALUES(1005, '머랭쿠키', 2000, '머랭~머랭~');
URL 결정
- 마켓컬리에서 소분류를 선택 시 카테고리가 달라진다
- 즉 하나의 테이블에서 대분류, 소분류에 따라 데이터를 다르게 가져온다 https://www.kurly.com/shop/goods/goods_list.php?category=908003
- 베스트 상품은 기존 카테고리가 있고 그 중에서 베스트 상품 선별
- 상품에 관한 기능은 상품 조회, 상품 등록, 상품 수정, 상품 삭제가 있다(상세페이지 X)
url | 설명 | Method |
---|---|---|
/product/list | 상품 리스트 보기 | GET |
/product/post | 작성할 수 있는 권한이 있는지 체크 | GET |
/product/post | 새로운 상품 등록 | [POST |
/product/post/{seq} | 작성할 수 있는 권한이 있는지 체크 | GET |
/product/post/{seq} | 기존에 있는 상품 수정 | [POST |
/product/delete | 상품 삭제 | GET |
Controller, Service , VO
- product 테이블의 데이터를 불러오는 쿼리
<select id="getProductVOList" resultType="ProductVO">
SELECT product_seq as productSeq
, category
, pic
, title
, price
, text
, count
, product_del as productDel
, user_seq as userSeq
FROM product
</select>
- Service
public ResultMap getProductVOList(){
List<ProductVO> list = dao.getProductVOList();
ResultMap resultMap = new ResultMap();
resultMap.setStatus("200");
resultMap.put("list", list);
return resultMap;
}
- Conroller
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(Model model) throws Exception {
ResultMap resultMap = service.getProductVOList();
model.addAllAttributes(resultMap);
return "product/list";
}
View
- list.jsp 를 생성하고 상품 리스트를 뿌려주는 화면 구성
<h2>상세 메뉴</h2>
<div><button id="product-new-product-create" class="btn btn-info">새 상품 추가</button></div>
<div id="product-list" >
<c:forEach var = "product" items = "${list}">
<div class="row col-md-4 col-xs-12 product-elements">
<input type="hidden" value="${product.productSeq}"/>
<input type="hidden" value="${product.category}"/>
<div><img src="/resources/${product.pic}" /></div>
<div class="product-in-text">${product.title}</div>
<div class="product-in-text">${product.price}원</div>
<div class="product-in-text">${product.text}</div>
</div>
</c:forEach>
</div><!-- product-list -->
- 상품 리스트 페이지로 이동하는 url 추가
<div class="dropbtn">전체상품</div>
<div class="dropdown-content">
<a href="/product/list">디저트</a>
<a href="/product/list">이유식</a>
</div>
</div>
Posts
Interceptor(인터셉터)
Android Studio Install
계층형 게시판
VirtualBox Ubuntu 18.04.2 LTS
TransactionAwareDataSourceProxy Error
Java Coding Conventions
Java Long과 long의 차이
Mybatis 객체 안에 객체 매핑
JavaConfig mariadb 연결
DataTable
관리자 페이지
MappingJackson2JsonView
Spring Javaconfig
게시판 만들기-제품 등록
게시판 만들기-제품 페이지 제작
게시판 만들기-회원탈퇴 및 게시판 삭제 플래그 추가
footer 하단에 고정시키기
bootstrap4 사용법
Spring 데이터 검증 @Valid, BindingResult
brackets 실시간 미리보기
Spring 기본설정(pom.xml, web.xml, encoding)
Vue.js computed, methods, watch
javascript onkeyup
Maria DB Incorrect string value Error
javascript 암호화(md5, base64)
Vue.js template
Vue.js 소개
Nexacro 설명
ControllerAdvice
Batch
html 페이지 로딩 순서
소수구하기(PrimeNumber)
최소공배수,최대공약수
Stream
Lambda(람다식)
inner class(내부 클래스)
final 키워드
file upload
파이썬 빅 데이터 K-평균(K-means)
아나콘다(Anaconda), 주피터 개발환경 세팅
텐서플로우(TensorFlow) 아키텍쳐 및 Session
텐서플로우(TensorFlow)상수, 변수, 함수
머신러닝 기초
한글 리스트 오름차순, 내림차순
연속된 글자의 갯수 출력
java spring5 프로젝트 설정
restController
spring 세팅 및 기본설정
mybatis trim
jquery datepicker
ajax로 데이터 전달/응답 받는법
mybatis error
mybatis 게시판 만들기 순서
Java Jsp Mybatis Dynamic Query
mybatis
git 소개
node.js 개발환경 구축
node.js 기본 내장 모듈
node.js의 전역 객체
node.js http module
node.js event
jdbc
자바빈
jsp, servlet 정리
java null object pattern
다음지도 key 등록(kakao map)
공공 데이터 open api
facebook login api
sourcetree 사용법
JavaScript event3
JavaScript jquery
JavaScript dom
JavaScript ajax
JavaScript 이벤트2
JavaScript 캡슐화
JavaScript Array,내장객체
JavaScript var
JavaScript 객체,생성자
JavaScript 함수,클로저
JavaScript Event
javascript eclipse 자동완성(with tern)
CSS position
HTML5,CSS 선택자
자바 시간 측정
git,eclipse 연동
HTML 기초 정리
Eclipse Web 환경세팅
피보나치의 수
Oracle 반복문,커서,예외,저장 서브프로그램
Oracle PL/SQL
Oracle 다중쿼리(Multiple row query)
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
Oracle JOIN 정리
Oracle DDL, DML 정리
Oracle 문자열 함수 정리
Oracle 숫자,날짜,자료형 변환 함수 정리
Oracle 제약조건 정리
Oracle 기초 쿼리 정리
문제2775
DFS
junit
json
algorithmus basic
circular queue(원형큐)
binary search(이진탐색)
port forwarding(포트포워딩)
kakao chatbot(카카오 챗봇)
java io
sort comparable, comparator
Unresolved compilation problem
ArrayList, HashMap
Regular(정규표현식)
Enum Class
String Function
refactoring 이란(상수,제어플래그,assert)
reference,abstract 정리
FileNotFoundException Solve
static
Thread Synchronization(스레드동기화,원자성)
Java Exception(예외처리)
Java 생성자, this, super
roomnum
BeeHouse
Git Reset, Revert
Git Log
Array
stack
pyramid draw
Star Draw(별 그리기4)
Star Draw(별 그리기3)
Star Draw(별 그리기2)
Star Draw(별 그리기1)
Loop(While, For)
자바 데이터 타입, 데이터 연산
시계방향 달팽이 그리기
정수값의 짝수,홀수 갯수 구하기
java, Scanner 정리
draw dog
subscribe via RSS