ParseInt( ) 숫자 형태의 문자열을 숫자로 바꾼다. 업캐스팅(OOP 중 다형성에 해당) 하위 클래스를 상위 클래스의 자료형으로 객체 생성 할 수 있다. 다운 캐스팅 상위 클래스를 하위 클래스의 자료형으로 객체 생성 자료형 확인(is)
의존성 역전 원칙(Dependency Inversion Principle) > 의존성 역전 원칙은 서로 다른 클래스 혹은 모듈 간의 결합도와 관련이 있다. 상위 레벨의 클래스가 하위 레벨(세부 구현) 에 의존적이지 않아야 한다. 인터페이스와의 의존성 제거(역전) 을
AbstractOperation.kt AddOperation.kt SubtractOperation.kt MultiplyOprtation.kt DivideOperation.kt Calculator.kt main.kt //정답 코드 보고 나서 리뷰: Lv 4에
- 오류1. 등록된 카드 내 드롭다운으로 선택한 생월 누락. JavaScript HTML 이전 코드 수정 코드 비어있던 select option value 값에 12달의 숫자를 차례로 넣어 (option value="11") 생월의 숫자인 value를 받게 했
b. 예외처리 Exception in thread "main" java.lang.NumberFormatException: For input string: "dskfsjld" 첫줄에 원인이 된 에러가 나온다. 예외처리 한 코드 c. 지연초기화 > 지연초기화를 활
a. 오버라이딩 > 자식(하위) 클래스에서 부모(상의) 클래스를 재정의하고 싶을때 쓴다. 수도권 : 추워요. 충북 : 추워요. 3시간 걸리는 충북은 추워요. 강원 : 추워요. 감자가 맛있는 강원은 추워요. b. 오버로딩 > 매개변수의 개수나 자료형을 다르게 하면 같
https://postiveemblem.tistory.com/164 readline()!! --> !! 쓰는 이유 null값이 아니다. ?를 쓰면 null이면 널값을 반영하라는 뜻 until => start 이상 end 미만 .. => start 이상 end
배열 배열의 생성 코틀린에서 배열을 선언하는 방법에는 크게 arrayOf와 Array가 있다. arrayOf는 배열의 크기를 지정할 수는 없지만 배열 선언과 동시에 배열의 원소 값을 직접 지정해줄 수 있다. 자료형을 명시하지 않은 경우에는 자료형이 혼합된 배열 생성
operator 키워드 - 이항 산술 연산 오버로딩
9번 짝수의 합 class Solution { fun solution(n: Int): Int { var answer: Int = 0 for (i in 2..n step 2){ answer += i
DTO(Data Transfer Object) > 데이터 전달을 위한 순수한 데이터 객체이다. 구현 로직을 가지고 있지 않고 순수한 데이터 객체를 표현만 해서 사용하면 된다. 데이터를 접근하는 게터/세터를 포함한다. toString(), Equals()등과 같은 데이
콜러/콜리 Framework : Application을 개발하기 위한 규약과 다양한 요소들을 제공하는 틀 Library : Application 개발 시 활용가능한 도구(코드)의 집합 Caller : 호출함 Callee : 호출 당함 어플리케이션을 기준으로 어플리케이션을 호출하는지 호출을 당하는지 구분한다. 프레임워크는 어플리케이션을 호출하는 콜러이고...
API 설계 courses 하위에 lecture와 application이 있다. 여기서는 로그인 URI를 /login이라고 표기했다. 다른 방식으로도 쓸 수 있는데 로그인을 하면 세션을 획득한다고 해서 /sessions 로 쓰이기도 한다. /sessions 예시 그래서 로그인 Method를 POST로 하고 URI를 /sessions라 한 것. 로...
상속(extend)과 추상화(abstract) 상속은 이미 존재하는 클래스의 기능을 확장하거나 수정하는 것에 초점을 맞춘다. 코드의 재사용성과 유지보수의 용이성을 제공한다. 추상화는 복잡한 시스템을 간단하게 표현하는 것에 초첨을 맞춘다.
비즈니스 로직 구현 단계. interface로 구현해 어떤 argument를 받고 어떤 response를 보낸다. 실질적으로 뒤에서 구현. 근데 사실 하나의 인터페이스에서 여러 서비스 구현체가 나올일 이 없어 클래스로 바로 구현체를 작성한다.
JDBC, Hibernate, JPA, Spring Data JPA 차이 MYSQL이나 postgresSQL을 사용해서 JDBC 데이터 구현체를 만든다. JDBC API는 하나의 인터페이스이다.
코틀린의 수학 함수를 쓰기 위해서 import kotlin.math.* 코틀린에서 제곱 연산을 하려면 kotlin.math 패키지의 pow 연산을 쓰면 된다. pow 연산은 Double, Float 두 가지 자료형만 지원된다. Double 자료형 제곱 연산 Fl
내가 쓴 코드 빈 리스트를 선언하고, 이 리스트에 map() 함수로 정수 n을 String으로 만들어 하나하나 쪼개서(it) 배열로 만들어 리스트에 담는다. 리스트에 담는 과정에서 toString()을 먼저 하고 toInt()로 변환해야한다. toString을 쓰지 않으면 "8","7","3","2",.. 가 정수로 변환되며 아스키코드가 담겨 틀린...
수정 전 수정 후 서비스한테 일을 안시켜서 삭제 기능 쿼리가 생성이 안됐었다.
TodoServiceImpl.kt TodoServiceImpl.kt 파일은 이전 step과 바뀐 것이 없다. 그저 응답 DTO 클래스에서 할일 id값에 해당하는 댓글 리스트를 클라이언트에게 보낼 수 있게 CommentResponse DTO 클래스를 객체로 받는 리스트를 생성했다. 리스트를 생성한 이유는 map {} 으로 생성되는 것이 리스트이기 때문이...
오류 메시지 "message": "Ambiguous handler methods mapped for '/todos/19': {public void com.teamsparta.todo.domain.todo.controller.TodoController.getAscOrDe
객체로 인해 책임과 역할을 나눌 수 있어 유지 보수 하기가 쉬워진다. 의존성 주입(DI)은 일체형과 조립형이 있고. 일체형은 클래스 객체 간 높은 결합도를 가지고 있고 조립형은 인터페이스를 이용해 클래스 간 낮은 결합도를 가지고 있다. 조립형은 객체를 부품처럼 쉽게 변경해 끼울 수 있지만 추가적인 로직을 생성해야 한다. 빈 객체를 생성해야 하고(var ...
아직 Order 테이블 연관관계를 SQL 쿼리문으로 안맺어서 NULL 값이 반환됨. ![](https://velog.velcdn.com/images/miso_/post/3020b5cf-3995-48ac-
프록시는 엔티티를 필요할 때만 꺼내쓸 수 있도록 하는 가짜 객체이다. 사용자는 객체를 그대로 써도 된다. Proxy 내 target이라는 필드가 있는데, 실제 데이터가 필요하면 이 target을 통해 id, name등 원래 entity의 속성값을 조회한다. 프록시는 DB와 엔티티를 연결한다. 프록시 객체는 실제 값이 필요할 때 DB에 값을 요청하게 된다...
게시판 (페이지네이션) 컨트롤러에서 전체 데이터의 개수를 세는 count 쿼리가 포함된 Page 객체를 반환타입으로 받았다. 서비스 구현에서 Pageable 인터페이스를 상속받아 Pageable의 구현체 PageRequest 생성자의 파라미터에 현재페이지, 조회할 데이터 수, 정렬 정보를 넣었다. Offset 방식을 사용해 limit 예약어를 통하여 ...
위에서 보면 OOP 옆에서 보면 AOP 트랜잭셔널을 이용해서 서비스를 오가며 사용 어플리케이션의 진행 단계 Aspect 횡단 관심사(부가기능)를 모듈화한 단위이다. Aspect는 부가기능을 정의하는 Advice와 적용 위치를 결정하는 PointCut으로 구성된다. PointCut Aspect가 적용될 프로그램상 실제 위치이다. JoinP...
@Component 개발자가 직접 작성한 클래스를 빈으로 등록하고 싶을 때 사용 @Configuration 개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 사용
fetch() : 리스트로 결과를 반환하는 방법. (만약에 데이터가 없으면 빈 리스트를 반환) fetchOne() fetchOne()은 getSingleResult(query)를 반환한다. getSingleResult()는 결과가 여러 건일 때 NonUniqueResultException을 throw한다. 이로 인해, fetchOne()을 사용하게 되면...
EntitiyManager 와 EntitiyManagerFactory 특징 엔티티 매니저 팩토리 엔티티 매니저 팩토리에서 필요할 때마다 여러 개의 엔티티 매니저를 생성해준다. 셍성비용이 크다. 한개만 만들어 프로그램 전체에서 공유하도록 설계되어 있다. 여러 스레드가 동시에 접근해도 안전하게 설계되었다. 엔티티 매니저 생성 비용...
영속성 컨텍스트 DB와 프로그램 사이에 공간이 있는데 이 공간이 영속성 컨텍스트이다. JPA 의 영속성 컨텍스트로 관리되는 엔티티들 엔티티의 생명주기 비영속 -> transient(new): 새로 작성된 엔티티가 영속성 컨텍스트에 담기기 전 상태 영속 -> managed: 영속성 컨텍스트에 담겨 관리되는 상태 준영속 -> detach...
DB가 제공하는 트랜잭션 기능을 사용하면 commit과 rollback으로 정상적인 작업이 가능하도록 할 수 있다. 계좌이체를 예시로 들면, 트랜잭션이 없다면 작업중 서버에 오류가 났을 때 중간에 이체된 돈은 그냥 사라지고 만다. 이런 서비스 참사를 막기 위해서 작업 중 하나라도 실패를 한다면 거래 이전으로 되돌리는데 이것을 롤백(rollback)이라...
Fetch Join 패치조인은 sql 에 존재하는 조인의 종류가 아닌 JPQL 의 성능을 최적화하기 위해 제공하는 조인의 한 형태이다. Qcomment 로 EntityPathBase 를 만들어 comment 변수로 comment 엔티티에 접근 가능하게 만들고, .leftJoin 으로 todo.comments -> todo 와 comment 로 이뤄진 ...
CommentRequest.kt Comment.kt CommentService.kt request에서 변경한 newContent를 content에 넣어주기만 해도 1차캐시(newContent)와 스냅샷(최초의 content)이 달라져서 flush() 되는 과정중에 업데이트 쿼리가 생성된다. update 메서드 안에 있는 content는 엔티티 컬럼의...
NoSuchEntityException 오류 메시지가 "존재하지 않는 %s입니다." 인데, 발생한 오류가NoSuchEntityException("MEMBER")였을때 오류 메시지는 "존재하지 않는 MEMBER입니다." NoSuchEntityException("POST") 의 오류가 발생했을때에도 "존재하지 않는 MEMBER입니다." 와 같이 이전의 ...
@Valid 를 사용하기 위해 implementation 'org.springframework.boot:spring-boot-starter-validation' 추가 후, LoginRequest.kt SignUpRequest.kt Validation 관련 annotation에 @field:를 prefix로 붙이고 message에 출력문을 적어준다. ...
FK만 집어 넣은 연관관계 매핑 team id로 매핑은 되지만 DB와 DB 사이를 억지로 집어넣은 느낌이 든다. 동작도 가능하지만 객체를 집어넣어서 매핑하는게 객체지향적으로 좋다. 이렇게 나온 개념이 ManyToOne, OneToMany라고 한다. 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 테이블: 외래 키로 조...
양방향 매핑 문제는 순환 참조 문제가 생길 수 있다. 서로를 계속 호출하는 문제가 발생! 순환 참조 문제 객체.response를 쓰는 이유는 서로의 엔티티를 계속 참조하다가 발생하는 순환참조를 방지하기 위해서다.
엔티티가 생성되고 변경되는 시점을 감지해 생성시각, 수정시각을 기록할 수 있다. 먼저 EnableJpaAuditing 어노테이션을 사용하여, Auditing을 활성화 해야한다. 이후 엔티티 클래스에 상속받고 사용한다.
로그인 오류 java.lang.ClassCastException: class java.lang.String cannot be cast to class com.teamsparta.member.global.auth.UserPrincipal (java.lang.String is in module java.base of loader 'bootstrap'; com...
로그인을 하면 리프레시 토큰이 저장되고(empty claims이다) 로그아웃을 하면 널값으로 바뀐다. Member.kt MemberService.kt 리프레시 토큰을 사용하면 왜 좋을까? 엑세스 토큰의 보안을 위해 엑세스 토큰의 시간을 짧게 지정하고 만료되기까지 더 긴 시간이 걸리는 리프레시 토큰으로 서
KEEP(지속할 것) 프로젝트 타임라인 설정 -> 기획 단계에서 기본 틀을 만들어놔서 개발할 때 매끄럽게 계획들을 진행할 수 있었다. 스프레드 시트로 테스트 코드 시나리오 공유 -> 다른 팀원의 도메인 정책을 이해하는데 아주 좋았다. PROBLEM(문제가 된 것) 추
직접 작성한 쿼리문을 테스트 하기 위해서 리포지토리 테스트를 작성했다.먼저 리포지토리 테스트를 위한 데이터베이스를 설정했다.보통 GIVEN 절에서 데이터를 설정할 때 모든 메서드에서 공동으로 사용하는 데이터가 있을 경우 BeforeEach를 활용해 중복을 제거할 수 있