'Web' 카테고리의 다른 글
SPA(single page application) Handlebars 활용하기 (1) | 2023.09.21 |
---|---|
HTML5 Basic (0) | 2023.09.19 |
Mybatis Mapper (0) | 2023.09.19 |
MyBatis Config (0) | 2023.09.19 |
AJAX Asynchronous Javascript And XML (0) | 2023.09.18 |
SPA(single page application) Handlebars 활용하기 (1) | 2023.09.21 |
---|---|
HTML5 Basic (0) | 2023.09.19 |
Mybatis Mapper (0) | 2023.09.19 |
MyBatis Config (0) | 2023.09.19 |
AJAX Asynchronous Javascript And XML (0) | 2023.09.18 |
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@SequenceGenerator(sequenceName = "board_boardno_seq", name = "board_boardno_seq")
private Long boardno;
private String title;
private String writer;
private String content;
@ColumnDefault("sysdate")
@CreationTimestamp
private LocalDateTime regdate;
private Long readcount;
private Long groupno;
private Long step;
private Long depth;
}
@UpdateTimestamp도 있어서 update시 regdate에 time을 넣어줄 수 있지만
CreationTimestamp와 중복하여 사용할 수 없다.
사용하려면 updatedate 필드를 만들어서 붙여야 한다.
@ColumnDefault 어노테이션은 jpa에서 insert할 때는 무시한다.
하지만 sql을 사용할때는 적용되기 때문에 붙여준다.
Repository
List<Board> findByStepGreaterThanAndGroupno(Long step,Long groupNo);
List<Board> findByBoardnoGreaterThanEqualOrderByGroupnoDescStepAsc(Long boardNo);
//Page<Board> findByBoardnoGreaterThanEqualOrderByGroupnoDescStepAsc(Long boardNo,Pageable pageable);
new_save() 새글 작성하기
void new_save() {
Board board1= Board.builder()
.title("게시판101")
.content("내용101")
.writer("101")
.build();
Board savedBoard1 = boardRepository.save(board1);
savedBoard1.setGroupno(savedBoard1.getBoardno());
savedBoard1.setStep(1L);
savedBoard1.setDepth(0L);
savedBoard1.setReadcount(0L);
savedBoard1= boardRepository.save(savedBoard1);
System.out.println(">>>savedBoard1:"+savedBoard1);
답글 작성
void reply_save() {
Board findBoard100 = boardRepository.findById(100L).get();
List<Board> updateBoardList100 =
boardRepository.findByStepGreaterThanAndGroupno(findBoard100.getStep(), findBoard100.getGroupno());
for (Board tempBoard : updateBoardList100) {
tempBoard.setStep(tempBoard.getStep()+1);
}
boardRepository.saveAll(updateBoardList100);
Board board101=Board.builder()
.title("게시판타이틀101")
.content("내용101")
.writer("김경호101")
.groupno(findBoard100.getGroupno())
.step(findBoard100.getStep()+1)
.depth(findBoard100.getDepth()+1)
.readcount(0L)
.build();
boardRepository.save(board101);
그룹넘버가 같고 step이 더 큰 글(답글을 달려는 원글의 답글들 , 원글이 답글이 될 수도 있다)에 step을 증가시킴
board101 글을 원글보다 step, depth를 증가시키고 save
void board_select() {
List<Board> boardList = boardRepository.findAll();
for (Board board : boardList) {
System.out.println(board);
}
boardList = boardRepository.findByBoardnoGreaterThanEqualOrderByGroupnoDescStepAsc(0L);
for (Board board : boardList) {
System.out.println(board);
}
글 목록 전체 조회
list를 groupno 내림차순, step 오름차순으로 정렬하여 select
orderBy 할때 앞에 조건문이 필요하여 BoardnoGreaterThanEqual 추가해주고 0L인자로 준다.
페이징 작업
void board_select_page() {
List<Board> boardList=boardRepository.findAll();
System.out.println(">>>boardList:"+boardList.size());
int currentPage=14; //현재페이지
int size=7; //페이지당게시물수
Pageable pageable=PageRequest.of(currentPage-1,
size,
Sort.by("groupno").descending()
.and(Sort.by("step").ascending())
);
/*
PageRequest.of(page, size)
- page zero-based page index.(요청페이지)
- size the size of the page to be returned.(페이지당 게시물 수)
*/
Page<Board> page = boardRepository.findAll(pageable);
for (Board board : page.getContent()) {
System.out.println(board);
}
}
Pageable 인터페이스
Pageable 인터페이스는 데이터베이스 조회 결과를 정렬하고 페이지를 나누고 그 페이징 관련 정보를 담고 있다.
Pageable pageable=PageRequest.of(currentPage-1,
size,
Sort.by("groupno").descending()
.and(Sort.by("step").ascending())
);
PageRequest의 of (page,size)메서드를 사용하면 페이지를 전체 리스트를 size로 나누어 페이징했을 때 구한 page의 paging 정보를 Pageable 인터페이스로 반환해준다.
추가로 page,size, Sort(정렬)을 대입할 수도 있다.
Sort.by("groupno").descending().and(Sort.by("step").ascending())
findAll 메서드에 Pageable을 인자로 대입하면 해당 Pageable의 Page를 반환해주고
Page의 getContent 하여 리스트를 얻을 수 있다.
반대로 Page에서 getPageable 을 하면 Pageable을 얻을 수 있다.
Thymeleaf Layout (1) | 2023.11.24 |
---|---|
JPA Object Relation Mapping (0) | 2023.10.11 |
Spring Data JPA begins (0) | 2023.10.06 |
Spring CRUD with RestAPI (0) | 2023.09.20 |
Spring addViewControllers (0) | 2023.09.14 |
EC2 (Elastic Computer Cloud) : 애플리케이션을 실행할 수 있는 서버 컴퓨터라고 생각하면 된다.
우리는 EC2로 서버를 실행시키고 클라이언트가 애플리케이션을 실행하려면 EC2의 IP나 EC2에서 제공하는 퍼블릭 도메인으로 애플리케이션에 접근할 수 있다.
DNS (Domain Name System) : IP 주소는 사람들이 기억하고 사용하기 어렵기 때문에 IP를 대신할 수 있는 이름인 Domain(도메인)을 IP 주소와 맵핑시켜놓아 Domain을 입력하면 해당하는 IP 주소를 찾아 그 주소의
애플리케이 션에 접근하게 해주는 시스템
Route 53 : 우리 컴퓨터는 IP 말고도 DNS서버 IP도 가지고 있다.
DNS 서버 IP는 IP 제공자인 ISP(Internet Service Provider, SKT, KT, ..텔레콤 ) 인터넷 서비스 제공 회사에서
제공한다. ISP의 DNS 서버에 우리가 원하는 IP 주소가 없으면 다른 DNS 서버에서 우리가 원하는
IP 주소를 찾아준다. 그러한 DNS 서버 중 하나가 Route 53
Application Load Balancer : 트레픽이 증가하여 새로운 EC2 인스턴스를 만들어 서버를 증설한 경우, IP가 다르기 때문에 새로 만든 EC2 인스턴스는 여전히 접근할 수 없다. 애플리케이션 로드 밸런서는 EC2 인스턴스들을 연결하여
트레픽을 적절히 분배해준다. EC2 인스턴스들이 공유하는 가상의 IP를 만들어 Route 53에 등록하고
Route 53은 도메인을 검색할 때 이 가상의 IP를 반환해준다.
Target Group : 애플리케이션 로드 밸런서에 연결된 EC2 인스턴스들을 말한다.
AutoScaliing Group (ASG,오토 스케일링 그룹) : ASG는 인스턴스가 다운되었을 때 EC2를 실행하고 타깃 그룹에 올리고 서비스 상태를 확인하는 작업을 자동으로 해주고 트래픽에 따라 스케일인(ScaleIn), 스케일아웃(ScaleOut)
하여 서버를 증설하거나 수축하는 등 타켓 그룹의 인스턴스를 관리하는 역할을 한다.
최소, 최대, 적정 인스턴스 수를 정하여 관리할 수 있다.
VPC (Virtual Private Cloud, 가상 사설 클라우드) : 사용자의 AWS 계정 전용 가상 네트워크, 특별한 설정 없이는 네트워크 안에 생성되는 EC2 외부(인터넷, 다른 AWS 계정)에서 접근할 수 없는 독립된 가상의 네트워크로 계정의
주인만이 네트워크에 접근 하는하다.
Subnet (서브-네트워크) : VPC 내에 존재하는 여러 개로 쪼개진 네트워크로 서브넷 내에 EC2 서버를 생성한다.
Elastic Bean Stalk (일래스틱 빈스톡) : 배포를 위한 인프라 구축을 대신 해주는 서비스로,
사용자가 필요한 리소스를 알려주면 일래스틱 빈스톡이 로드 밸런서, 오토 스케일링 그룹,
RDS(데이터베이스), EC2 환경을 구축하고 EC2에 우리 애플리케이션을 실행시켜준다.
내부적으로 JSON, YML 파일을 인풋으로 받아 설정파일의 리소스와 리소스 관계를 읽어 인프라를 구축해주는 AWS 클라우드포메이션(CloudFormation) 서비스를 이용한다.(Infrastructure as Code,코드를 읽어 인프라구축)
프로그레스 배열이 주어지고 진행 속도 배열이 주어진다.
프로그레스가 100이 되면 배포할 수 있는데 , 순서에 따라 배포할 수 있기 때문에
앞의 프로그레스가 100이 되지 않으면 뒤의 프로그레스는 100이 되어보 배포될 수 없다.
그래서 앞에서부터 순서대로 기능이 완성되어 배포할 때 한번에 여러개가 동시에 배포될 수 있다.
매번 배포할 때마다 몇개의 완성된 기능이 배포되는지 반환
일단 하루가 지나면 프로그레스의 모든 기능들은 스피드만큼 프로그레스가 증가한다.
그리고 매일 프로그레스가 100이 넘었는지 확인해주고 넘었으면 다음 프로그레스도 함께 확인하고
다음 프로그레스가 100이 아닌 것을 확인했을 때, 그때까지 100이 넘어 배포해야할 프로그레스의 개수를 list에 넣는다.
for (int i = 0; i < speeds.length; i++) {
progresses[i] += speeds[i];
}
매일 모든 프로그레스가 스피드만큼 증가
if (progresses[j] >= 100) {
count++;
continue;
}
프로그레스가 100이 넘었는지 확인하고 넘었으면 배포할 개수 count를 증가시키고 다음 프로그레스도 확인한다.
카운트가 0 이 아니라면 ( 배포해야할 순서의 프로그레스가 100이 넘었다면 ) list에 count를 추가하고 다시 카운트를 0으로 초기화한다.
if (count != 0) {
answer.add(count);
count = 0;
}
전체풀이
public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
ArrayList<Integer> answer = new ArrayList<Integer>();
int count = 0;
for (int j = 0; j < progresses.length; j++) {
if (progresses[j] >= 100) {
count++;
continue;
} else {
j--;
for (int i = 0; i < speeds.length; i++) {
progresses[i] += speeds[i];
}
}
if (count != 0) {
answer.add(count);
count = 0;
}
}
if (count != 0) {
answer.add(count);
}
return answer;
}
j를 감소시키는 이유는 프로그레스가 100이 넘지 않았는데 다음 프로그레스를 확인하면 안되기 때문에 다시 j를 감소시키고 하루가 지났다 가정하고 모든 프로그레스를 스피드만큼 증가시키고 재확인할 수 있게 해준다.
마지막 남은 프로그레스가 100이 되면 count를 증가시킨 후 continue로 빠져나와 list에 추가하지 못하기 때문에
for문을 빠져나온 후 한번더 list에 추가해준다.
카펫 문제 풀이 (0) | 2023.10.06 |
---|---|
올바른 괄호 문제 풀이 (1) | 2023.10.05 |
크레인 인형뽑기 게임 문제 풀이 (0) | 2023.10.04 |
로또의 최고 순위와 최저 순위 문제 풀이 (0) | 2023.10.04 |
다트 게임 문제 풀이 (0) | 2023.10.04 |