코트카타
39) 최대공약수와 최소공배수
나의 풀이
import java.util.Arrays;
class Solution {
public long[] solution(int n, int m) {
long[] answer = new long[2];
int i = 1;
int min = Math.min(n, m);
int gcd = 1;
long lcm = 1;
while(i <= min){
if (n<2 || m<2){
lcm = n*m;
break;
}
if (n%i==0 && m%i==0){
gcd *= i;
n/=i;
m/=i;
}
if (i == min){
lcm = (long)gcd*n*m;
break;
}
i++;
}
answer[0]=gcd;
answer[1]=lcm;
return answer;
}
}
이렇게 하니 계속 틀렸다고 나왔다...
사실 이게 나의 최선이었는데...
오버플로우가 문제인가 해서 타입을 int -> Long으로 바꾸었으나 문제가 계속 발생했다.
다른 분들의 풀이
class Solution {
public int[] solution(int a, int b) {
int[] answer = new int[2];
answer[0] = gcd(a,b);
answer[1] = (a*b)/answer[0];
return answer;
}
public static int gcd(int p, int q){
if (q == 0) return p;
return gcd(q, p%q);
}
}
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12940/solution_groups?language=java
유클리드 호제법을 알아야 한다고 한다.
이를 사용하지 않으면 정확성이 떨어진다고...
따로 메서드를 만드신 점이 인상깊었다.
나도 이제부터는 메서드를 따로 만드는 습관을 가져야겠다.
일정관리 개인과제 피드백
전반적으로 좋은 피드백을 받았다.
하지만 이에 그치지 않고, 앞으로의 과제나 팀 프로젝트에서 발전된 모습을 보이기 위해
나의 과제를 피드백 해주신 튜터님께 피드백 관련 궁금한 점을 여쭈어보았다.
[아쉬운 점]
페이지네이션 시 첫번째 페이지를 1로 설정하셨는데,
컴퓨터 상의(개발자 영역의) 첫 번째 인덱스는 0으로 통일해주셔야합니다.
=> controller에서 @RequestParam(value="pageNo", defaultValue="1") int pageNo을 사용했었는데
@RequestParam(value="pageNo", defaultValue="0") int pageNo으로 통일하라고 말씀해주셨다.
또한 Entity에서의 Setter은 지양해야하는 방식입니다. 필요한 것들만 만드셔서 사용하세요.
=> @Setter
private LocalDateTime createdAt; //Setter를 통해 now()값 주입
@Setter
private LocalDateTime updatedAt; //Setter를 통해 now()값 주입
위와 같이 Setter를 사용했었는데 생성자주입을 지향하며,
위의 부분은 메서드를 만들어주는 것이 더 좋다고 하셨다.
1%라도 문제가 생길 것은 하지마라
데이터의 변경이 없는 조회는 괜찮지만 setter는 변경이니까 주의해서 써야 한다고 말씀하셨다.
생성자 주입 DI에서 생성자를 직접 만들어주고 계십니다. 어노테이션을 통해 생성해주세요.
나중에 DI받아야할 메소드들이 많아지는데, 일일이 필드에 등록->생성자 추가 하려면 번거로워집니다.
=>@RequiredArgsConstructor 사용해서 생성자를 만들라고 하셨다.
나중에 한 서비스에 DI 받는 게 수십 개일 수 있기 때문이다.
ApiError 객체 생성 시에 "deleted","id" 이런거 넣어주고 계신데, 요게 뭔지 모르겠습니다.
정합성이 요구되는 부분에선 강타입의 언어로 해주세요(Enum)
// 삭제된 일정인지 확인 (deleted = true이면 예외 발생)
if (deleted){
throw new ApplicationException(ErrorMessageCode.NOT_FOUND,
List.of(new ApiError("deleted", "이미 삭제된 정보입니다. 다시 입력하세요")));
}
=> 임의로 사용하지 말고 서로 합의되어 있는 강타입 Enum 값을 사용하라고 말씀해주셨다.
주석도 명확하지만 이왕 주석 하시는거
Java docs 이용해 Param, Return , Exception 등도 설정해보시기 바랍니다.
=>
/**
* @Param
*/
코드를 안보더라도 주석만 보고도 알 수 있도록 지금부터 연습해보기
2025.02.06
필수
Lv 0. API 명세 및 ERD 작성
이 부분은 과제 구현 후 작성하고자 한다.
Lv 1. 일정 CRUD
application.properties 설정 주의하기
2025-02-06T16:28:25.400+09:00 INFO 5078 --- [Schedule-Develop] [ main] org.hibernate.orm.connections.pooling : HHH10001005: Database info: Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 9.2 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: com.example.scheduledevelop.domain.entity.Schedule.username] with root cause
위와 같은 예외가 발생했다.
package 안에 있는 코드는 강의 실습 코드를 바탕으로 작성했으므로 큰 실수는 없을 것이라고 생각했다.
따라서 아마도 JPA 설정은 처음이라 설정 부분에서 빠진 부분이 있을 것이라고 판단했다.
application.properties에 아래와 같은 코드를 추가했더니 잘 작동했다.
spring.application.name=Schedule-Develop
spring.datasource.url=jdbc:mysql://localhost:3306/schedule-develop
spring.datasource.username=계정
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
일정 생성 후, DB에서 생성일, 수정일 null 발생
위와 같이 생성일과 수정일에 null이 되었다.
@EnableJpaAuditing
@SpringBootApplication
public class ScheduleDevelopApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleDevelopApplication.class, args);
}
}
원인은 ScheduleDevelopApplication 파일에
@EnableJpaAuditing을 하지 않은 것이 문제였다.
위와 같이 설정하고 다시 실행하면 아래와 같이 DB에 잘 들어온 것을 확인할 수 있다.
위와 같은 일을 겪고 나니 JPA 설정에 대해서는 적어도 잊어버리지 않은 것 같다는 생각이 들었다.
일정 단건 조회 구현 시, 컴파일 에러 발생
@GetMapping("/{scheduleId}")
public RequestEntity<ScheduleResponseDto> findById(@PathVariable("scheduleId") Long id){
ScheduleResponseDto scheduleResponseDto = scheduleService.findById(id);
return new RequestEntity<>(scheduleResponseDto,HttpStatus.OK);
}
위와 같이 responseEntity가 아닌 requestEntity를 사용해서 발생한 오류였다.
Response를 반환해야 한다고 머리로는 생각했으면서도
손은 그렇게 작성하지 못했고
눈은 그것을 판별하지 못했지만
다행히? 컴파일 에러로 보여서 잘 수정할 수 있었다.
Lv 2. 유저 CRUD
오늘 유저 자체의 CRUD는 구현을 완료했으나,
일정은 이제 작성 유저명 필드 대신 유저 고유 식별자 필드를 가집니다.
위의 부분에 대해서
일정 테이블과 유저 테이블의 연관 관계 매핑에 대해서
좀 더 고민해보고 구현할 예정이다.
'CODING > 스파르타 내일배움캠프 TIL' 카테고리의 다른 글
38_3진법 뒤집기_일정관리 Develop 개인과제 Lv 2,3,4 필수과제 구현완료_25.2.7(금) (0) | 2025.02.07 |
---|---|
일정 관리 앱 Develop 개인과제 관련 트러블슈팅 TIL 모음 (0) | 2025.02.06 |
36_직사각형 별찍기_스탠다드 트랜잭션, 인덱스_숙련 Spring 3주차_25.2.5(수) (0) | 2025.02.05 |
35_행렬의 덧셈_일정관리 개인과제 해설_숙련 Spring 1,2주차_25.2.4(화) (1) | 2025.02.04 |
34_문자열 다루기 기본_스탠다드 데이터베이스 연관관계 매핑_일정관리 과제 Lv 5 구현완료_25.2.3(월) (0) | 2025.02.03 |