@builder
: 자기 자신만 쓸 수 있음@SuperBuilder
: 상속관계에서 부모까지 빌더 패턴으로 쓸 수 있다.@ToString
: 객체를 문자열로 볼때 객체그대로 볼 수있다.@MappedSuperclass
: 객체의 입장에서 공통 매핑 정보가 필요할 때 사용reverse()
: 저장되어 있는 문자열의 순서를 거꾸로 나열하는 메서드to String()
: StringBuffer 인스턴스의 문자열을 String으로 반환한다..append()
: StringBuffer 인스턴스가 저장하고 있는 문자열 뒤에 덧붙인다Integer parseInt(String 값)
: String타입의 숫자를 int타입으로 바꿔줌form
: action 생략되어있으면 GET요청이다.param
: 스프링부트에서 제공해주는 기본 객체white-space:nowrap
: 줄바꿈X => 글자들이 한줄로 나옴overflow-x:visible
: 가로방향으로 넘치는 부분을 그대로 보여줌(기본값)text-overflow:ellipsis
: 넘쳐서 숨겨진 텍스트를 ... 로 처리함Set
: 중복을 허용하지 않는 자료형enum
: YES or NO / 권한 체크implements
: 인터페이스 상속bindingResult.rejectValue(필드명, 오류코드, 에러메시지)
@Configuration
: 설정파일을 만들기 위한 어노테이션 or Bean을 등록하기 위한 어노테이션@EnableWebSecurity
: 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션/**
: 전체를 의미한다.BCryptPasswordEncoder
: 비밀번호를 암호화시켜줌@override
: 부모로부터 받아와서 재정의isAnonymous()
: 익명인지 검증isAuthenticated()
: 인증이 됐음
sec:authorize="isAnonymous()"
: 로그인 되지 않은 경우에만 해당 엘리먼트가 표시되게 한다.
sec:authorize="isAuthenticated()"
: 로그인 된 경우에만 해당 엘리먼트가 표시되게 한다.
.invalidateHttpSession(true))
: 로그인하고 있는 것을 기억하는것principal
: 전역적으로 현재 로그인한 유저 아이디를 가져와준다. ?@PreAuthorize
: 사전 권한 인증@PreAuthorize("isAuthenticated()")
: 로그인 페이지로 이동한다.@Valid
: 검증required
: 필수값placeholder
: 반 투명글씨로 설명 적을 수 있음autocomplete = "off"
: 자동 완성 끄기<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
return "redirect:/question/list";
: 질문 저장후 질문목록으로 이동alert alert - danger
: (부트스트랩 클래스) 부트스트랩 경고창BindingResult
: @Valid 애너테이션으로 인해 검증이 수행된 결과를 의미하는 객체이다.#lists.size
: 갯수를 가져옴${ }
: 데이터 영역@RequiredArgsConstructor
: 생성자 함수를 알아서 만들어준다.redirect:<URL>
: URL로 리다이렉트한다는 뜻@PathVariable ("변수명")
: 경로 변수is presnt( )
: 존재하는지 여부 따질때 사용super( )
: 부모 생성자 함수 호출@ResponseStatus
: 에러 터졌을때 status에 대한 상태를 정해주는것@RequestMapping("/question")
: 모두 /question으로 시작하는 경우에 /question 를 생략한 그 뒷 부분만 적거나 안 써도 괜찮다.<form action=""></form>
: 데이터를 담는 태그< textarea></textarea>
: 긴 내용을 쓸때 사용method = "post"
: GET이랑 다르게 바디에 노출되지 않고 전송된다.@DisplayName( )
: 무슨 테스트인지 알려주는 어노테이션Optional
: 값이 있을 수도 있고 없을 수도 있다고 알려줌@Transactional
: DB 연결이 끊어지지 않는다. 
: 띄어쓰기text-decoration
: 글자 언더라인 빼줌 ( text-decoration : none; )<1>
@GetMapping("/home/modifyPerson")
@ResponseBody
public String modifyPerson(int id, int age, String name) {
Person p = null;
for (int i = 0; i < people.size(); i++) {
// Person person = people.get(i); => get(i)
// get(i)는 people이 갖고있는것들을 표시한것(id, age, name)
if (people.get(i).getId() == id) {
p = people.get(i);
}
}
p.setName(name);
p.setAge(age);
return "";
}
}
<2>
@GetMapping("/home/modifyPerson")
@ResponseBody
public String modifyPerson(int id, int age, String name) {
Person foundPerson = people
.stream()
.filter(p -> p.getId() == id)
// .filter() : 어떤 특정 조건에 부합되는것만 남겨놓음
.findFirst() //첫번째 값 반환 (메서드 이름 유추)
.orElse(null); // 특정 조건이 아닌 경우엔 null이다는 뜻
if (foundPerson == null) {
return id + "번 사람이 존재하지 않습니다.";
}
foundPerson.setAge(age);
foundPerson.setName(name);
return id + "번 사람이 수정되었습니다.";
}
}
<br>
: 줄바꿈 엘리먼트target
= "" : 새 창으로 이동<a></a>
: 링크 버튼<1>
public String removePerson(int id) {
Person p;
for (int i = 0; i < people.size(); i++) {
p = people.get(i);
people.remove(p);
}
return "%d번 사람이 삭제되었습니다.".formatted(p.getId());
<2>
@GetMapping("/home/removePerson")
@ResponseBody
public String removePerson(int id) {
boolean removed = people.removeIf(person -> person.getId() == id);
// removeIf : 리스트 객체에서 자동으로 적용해주는 메서드
// Person으로 순회 -> 그 중 하나(getId())가 내가 받아온 id랑 값이 같다면 삭제 / 삭제하면 TRUE or FALSE로 리턴
if (removed == false) {
return id + "번 사람이 존재하지 않습니다.";
}
return id + "번 사람이 삭제되었습니다.";
}
@ID
: 고유키지정(PK)toUpperCase()
: 소문자 -> 대문자toLowerCase()
: 대문자 -> 소문자charAt()
: 저장된 문자열 중에서 한 글자만 선택해서 받아줌Arrays.sort()
: 오름차순 정렬
- 컨트롤러의 의미
고객(브라우저)의 요청을 수집하고, 관련부서로 토스해 주는 역할을 합니다.
관련부서에서 해당일을 처리하여 컨트롤러에서 다시 알려주면, 컨트롤러는 그 내용을 다시 고객(브라우저)가 이해할 수 있는 형태로 바꿔서 최종적으로 고객에게 응답합니다.
은행으로 비유하면, 창구에 앉아서 고객과 직접적으로 소통하는 창구직원에 비유할 수 있습니다.
@GetMapping("/home/addPerson")
@ResponseBody
public String addPerson(String name, int age) {
Person p = new Person(name, age);
-> 인스턴스 변수로 선언한 모습...
// List<Person> people = ArrayList<>(); //이렇게 쓰면 호출할때마다 계속 새로운 값 넣어주니까 배열이 한 개 밖에 없다.
// people.add(p); 그래서 전역적으로 쓸 수 있게 인스턴스 변수로 선언해야함(맨 위에)
System.out.println(p);
people.add(p);
return p.getId() + "번 사람이 추가되었습니다.";
// 참고 return "%d번 사람이 추가되었습니다.".formatted(p.getId()); 변수 치환된 값이 %d에 자동으로 들어감
}
@GetMapping("/home/People")
@ResponseBody
public List<Person> showPeople() {
return people;
}
@Getter
@AllArgsConstructor
@Tostring // 본래의 데이터 상태를 보여줌
class Person {
// static = 본사 데이터 -> 지점 데이터들한테 공유 가능 ...
private static int lastId;
private final int id;
private final String name;
private final int age;
//밑처럼 static을 써주면 person 객체가 생성될때 초기화 된다.
static {
lastId = 0;
}
Person(String name, int age) {
// this.id = lastId++;
// this.name = name;
// this.age = age;
// this.~ : 속성에 접근함 this() : 생성자 함수에 접근함
this(lastId++, name, age);
}
}
git log --oneline --graph --all
: 전체 로그 조회git fetch prune
: 맨 마지막에 원격 정리git push origin (브랜치명)-f
: 리베이스 충돌났을때 푸쉬git -rm --cached (삭제할파일)
: 원격 저장소 파일만 삭제git branch -D
: 로컬 브랜치 삭제contains()
: 대상 문자열에 특정 문자열이 포함되어 있는지 확인하는 함수starswith()
: 특정 문자 또는 문자열로 시작하는지 체크하는 함수endswith()
: 대상 문자열이 특정 문자 또는 문자열로 끝나는지 체크