KoreaDevKNOWLEDGE SHARING

Content typeLearn

AI SOFTWARE DEVELOPMENT · 01 / 10

Evolution of web development and modern architecture

Connects the reasons web architecture changed, from static documents to dynamic services, SPA, and server rendering, through a single request path.

Difficulty
Beginner
Structure
Lessons 8 · Labs 2 · Assessment

CORE UNIT 1 / 1

Evolution of web development and modern architecture

Connects the reasons web architecture changed, from static documents to dynamic services, SPA, and server rendering, through a single request path.

Difficulty
Beginner
Structure
Lessons 8 · Labs 2 · Assessment

Diagrams and tables: composed by the author using each lesson's official primary sources. Find the originals and review dates at the end of that lesson.

NEW HIRE ONBOARDING

Start in the order you would receive your first assignment

So that even a new hire with no prior IT background can follow along, we start with the situation, the task, the evidence, and when to report, before difficult definitions.

  1. 01

    Read the situation in one sentence

    Public news is updated every 10 minutes, and search traffic matters. A signed-in dashboard shows each user's live account balance, and the balance API must not be cached.

  2. 02

    Today's assignment

    Explain the browser, server, API, database, and deployment boundaries through the round trip of a single request.

  3. 03

    Evidence that shows the work is complete

    Check identical query interpretation on direct entry, reload, back navigation, and invalid URLs.

  4. 04

    When to stop and ask a senior colleague

    Because state exists in two places, URL handling, back navigation, error recovery, and accessibility must be designed separately.

Unpack unfamiliar terms first

From the document web to the dynamic web
The Web's original promise was not a display technology but a common set of rules for requesting resources by address and receiving responses.
Why frontend and backend separated
Separation is not a fad for adding servers; it is a contract that makes change cycles and responsibilities independent.
From JavaScript to TypeScript and React
React organizes the UI into components and state, and TypeScript checks the shape of values at those boundaries before execution.

Questions for this course

Why did it change, and what must be verified?

Do not merely memorize a technology's advantages; check the conditions under which they hold and the new failure boundaries they introduce.

OBSERVABLE OUTCOMES

What you can do after this course

  1. Explain the browser, server, API, database, and deployment boundaries through the round trip of a single request.
  2. Compare MPA, SPA, SSR, SSG, and Server Components by where rendering happens and when content is refreshed.
  3. Choose a structure that fits the functional, search, initial-loading, and operational requirements, and verify the cost of that choice.

PREREQUISITE CHECK

Three things to check before reading

This is not a test of memorized answers. Think about each question first, then open the explanation to review the foundational concepts used in this course.

1What does the browser get when you open the address?

The first response is usually HTML, and that document then requests additional resources such as CSS, JavaScript, and images. Depending on the app architecture, later screen transitions happen through new HTML or data requests.

2Are frontend and backend language names?

No. It is the boundary between interactions visible on the user’s device and the responsibility for processing rules and data on the server. Both sides can be implemented in the same language.

3Do new technologies always replace the old ones?

Most add options that are advantageous under specific constraints. Static HTML, server rendering, and client rendering are still used together today, depending on requirements.

TEXTBOOK GUIDE

Main text that covers each concept from its background to the criteria for judging it

We explain the material section by section so readers new to IT can connect causes and effects without memorizing terms.

CONCEPT FLOW

How the chapters connect

The chapters are not isolated short answers to memorize. Follow them from left to right to see how each chapter's concepts support the next decision.

  1. 1.From the document web to the dynamic web
  2. 2.Why frontend and backend separated
  3. 3.From JavaScript to TypeScript and React
  4. 4.From React to Next.js: choosing where to render
  5. 5.The full request path connecting API, DB, and deployment
  6. 6.Search results arriving out of order
  7. 7.Verify readable HTML and working interaction separately
  8. 8.Filters and detail views recoverable through URLs
Evolution of web development and modern architecture: the overall map. If you lose track while reading the detailed explanations and chapters below, return to this sequence.
Figure 1-1. Evolution of web development and modern architecture: concept developmentShows how each chapter’s choices and limits lead to the problems of the next chapter.
  1. 1
    From the document web to the dynamic web

    The Web's original promise was not a display technology but a common set of rules for requesting resources by address and receiving responses.

  2. 2
    Why frontend and backend separated

    Separation is not a fad for adding servers; it is a contract that makes change cycles and responsibilities independent.

  3. 3
    From JavaScript to TypeScript and React

    React organizes the UI into components and state, and TypeScript checks the shape of values at those boundaries before execution.

  4. 4
    From React to Next.js: choosing where to render

    The key to modern frameworks is not choosing SPA unconditionally but choosing where and when computation happens for each route.

  5. 5
    The full request path connecting API, DB, and deployment

    A single click the user sees is an operational contract that passes through DNS, TLS, the CDN, frontend, API, DB, and observability signals.

  6. 6
    Search results arriving out of order

    Render the state currently requested by the user, not whichever response arrives last.

  7. 7
    Verify readable HTML and working interaction separately

    Visible content and connected React events are separate completion criteria.

  8. 8
    Filters and detail views recoverable through URLs

    Define a recoverable URL contract for state needed by sharing, reload and back navigation.

CONTROLLED EXPLANATION

View state that preserves search B

Current state: Request A

View state that preserves search B

A teaching case separating request identity from view updates so A’s late failure cannot overwrite B’s success.

User changes conditionsValidate responseApply to viewDelayed responseReject overwrite1Request A2Request B3B succeeds4A fails late5Keep view B
  1. Request A

    Sequence 1 · previous conditions

  2. Request B

    Sequence 2 · current conditions

  3. B succeeds

    Matches current sequence

  4. A fails late

    Does not match current sequence

  5. Keep view B

    Verify result IDs and query conditions

1 → 2
User changes conditions
2 → 3
Validate response
3 → 5
Apply to view
1 → 4
Delayed response
4 → 5
Reject overwrite

Sequence identifies a request; arrival time does not establish freshness.

CONCRETE CASES

Selection criteria for all courses

TABLE 1-1

Selection criteria for all courses

Compare the technology in each chapter by how it works, the new costs it adds, and the evidence to check, not by its name.

Table 1-1. Evolution of web development and modern architecture: design decision criteria
.Core mechanismCosts to watchEvidence to check
1. From the document web to the dynamic webThe browser requests only the data it needs and updates part of the DOM, reducing full-document round trips.Because state exists in two places, URL handling, back navigation, error recovery, and accessibility must be designed separately.Observe how core tasks behave with JavaScript disabled, a slow network, and back navigation.
2. Why frontend and backend separatedAPI schemas and versioning policies loosely couple components with different deployment cycles.Each boundary adds network, serialization, authentication, and observability costs.Map the components that must be modified and deployed together for a single feature change to see the actual coupling.
3. From JavaScript to TypeScript and ReactThe type checker compares the structure of component props and function calls and reports mismatches before execution.Type design and build time add cost, and incorrect types can create a false sense of safety.Change fields in the external JSON and compare what type checks, runtime validation, and UI tests each catch.
4. From React to Next.js: choosing where to renderSet server/client boundaries for each route and component, and deliver the needed parts through prefetching and streaming.Requires understanding cache invalidation, hydration, server/client serialization, and framework rules.Tabulate each route’s personalization, allowed refresh interval, and initial-content requirements, then choose a strategy.
5. The full request path connecting API, DB, and deploymentExplicit contracts and correlation IDs connect processing across layers into evidence for a single request.Each added layer brings more timeout, retry, cache-consistency, and ownership issues.Check whether a single request's status, latency, revision, query, and errors can be linked across layers.
6. Search results arriving out of orderComparing request identity with current view conditions prevents stale responses from being applied.Cancellation and result validation both need design; do not assume completed server mutations were canceled.Reverse response order and mix successes and failures to check that the latest user conditions remain authoritative.
7. Verify readable HTML and working interaction separatelyVerify client initialization and saved-state restoration while preserving the same initial article.The transition from initial rendering to personal-state restoration needs explicit design and interaction tests.Check article-node preservation, restored completion, two clicks and persistence changes separately.
8. Filters and detail views recoverable through URLsParse the URL into validated query conditions shared by the view and server.Define disclosure and invalid-value policies; not every state belongs in the URL.Check identical query interpretation on direct entry, reload, back navigation, and invalid URLs.

CHAPTER 1 / 8

From the document web to the dynamic web

The Web's original promise was not a display technology but a common set of rules for requesting resources by address and receiving responses.

Why this concept became necessary

The early Web excelled at distributing linked documents. The simple combination of URL, HTTP, and HTML let authors and readers find and read the same document in different environments, but data that varied by user and immediate responses to input had to be handled by the server generating and returning a new document.

CGI and server-side templates produced dynamic pages by executing programs or assembling HTML for each request. Keeping computation and data access on the server simplified deployment, but even small interactions required full-page round trips, and UI code and business rules were easily mixed in one file.

JavaScript made it possible to modify documents in the browser and update part of a page through asynchronous requests. This did not eliminate the server; it redistributed responsibility, moving user interaction to the browser while the server continued providing data and rules.

Figure 1-2. From the document web to the dynamic web: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

The Web's original promise was not a display technology but a common set of rules for requesting resources by address and receiving responses.

How it works

The browser requests only the data it needs and updates part of the DOM, reducing full-document round trips.

Verification evidence

Observe how core tasks behave with JavaScript disabled, a slow network, and back navigation.

Follow it through a concrete system

For example, a company profile page in the 1990s could send the same file to every visitor. But when shopping carts, message boards, and online banking required different state for each user, servers had to read cookies and sessions from requests and insert database results into HTML. The screen was still a complete document, but producing it changed from copying a file to executing a program.

Knowing this history helps avoid labeling static pages as old and dynamic applications as new. Help content that changes rarely can use prebuilt HTML for faster delivery and fewer failure points. In contrast, live inventory and personal permissions require request-time computation. For each page, first decide who produces the content, when it is regenerated, and how stale a result is acceptable on failure.

Selection criteria and failure boundaries

Because state exists in two places, URL handling, back navigation, error recovery, and accessibility must be designed separately.

Misconceptions to avoid: It is incorrect to assume that the dynamic web must always be a JavaScript SPA.

Verify it yourself

Observe how core tasks behave with JavaScript disabled, a slow network, and back navigation.

What to judgeThe browser requests only the data it needs and updates part of the DOM, reducing full-document round trips.

To summarize this chapter

The Web's original promise was not a display technology but a common set of rules for requesting resources by address and receiving responses.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Ecma TC39, 「ECMAScript Language SpecificationReview date 2026-08-28 · Scope Living specification
  2. Vercel, 「Linking and NavigatingReview date 2026-08-28 · Scope Next.js App Router

CHAPTER 2 / 8

Why frontend and backend separated

Separation is not a fad for adding servers; it is a contract that makes change cycles and responsibilities independent.

Why this concept became necessary

As screens grew more complex, frontends specializing in components and client state grew, and as multiple screens and mobile apps came to use the same data, backends began providing APIs instead of HTML. Before it is an organizational boundary, an API is a contract that agrees on inputs, outputs, errors, and permissions.

REST is one design approach that uses HTTP resources and methods, not the right answer for every API. GraphQL, RPC, and events also differ in call style, coupling, caching, and operational tooling. What matters more than the name is a contract that consumers can predict and a compatibility policy.

Splitting services into smaller pieces can make per-team deployment and some scaling easier, but it adds the costs of network failures, distributed transactions, tracing, and version management. If one well-structured application meets the requirements, adding more microservices is not evidence of maturity.

Figure 1-3. Why frontend and backend separated: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

Separation is not a fad for adding servers; it is a contract that makes change cycles and responsibilities independent.

How it works

API schemas and versioning policies loosely couple components with different deployment cycles.

Verification evidence

Map the components that must be modified and deployed together for a single feature change to see the actual coupling.

Follow it through a concrete system

In early server applications, URL handling, SQL, business rules, and HTML assembly tended to collect in a single request function. A small screen change could end up touching database queries, and adding a mobile app meant reimplementing the same rules. Separating frontend and backend was an attempt to divide code that changes for different reasons along a reviewable boundary called an API.

In an online order, the frontend can display amounts clearly and flag input errors quickly, but the backend must independently determine the final discount and inventory deduction because users can modify browser values. The key boundary is therefore where untrusted input is validated and which state changes are allowed only once, not which team uses which language.

Selection criteria and failure boundaries

Each boundary adds network, serialization, authentication, and observability costs.

Misconceptions to avoid: There is no ranking in which microservices are inherently more modern than a monolith.

Verify it yourself

Map the components that must be modified and deployed together for a single feature change to see the actual coupling.

What to judgeAPI schemas and versioning policies loosely couple components with different deployment cycles.

To summarize this chapter

Separation is not a fad for adding servers; it is a contract that makes change cycles and responsibilities independent.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Vercel, 「Server and Client ComponentsReview date 2026-08-28 · Scope Next.js App Router
  2. Vercel, 「Linking and NavigatingReview date 2026-08-28 · Scope Next.js App Router

CHAPTER 3 / 8

From JavaScript to TypeScript and React

React organizes the UI into components and state, and TypeScript checks the shape of values at those boundaries before execution.

Why this concept became necessary

JavaScript's flexibility made it quick to build features in the browser, but in large codebases the values a function expected often stayed hidden until runtime. TypeScript adds static type annotations to JavaScript and emits JavaScript after checking, turning calls with mismatched value shapes into earlier feedback.

A React component bundles part of the UI as input props and output markup, and state declares values that must be remembered between renders. This structure turns the screen into reusable units, but splitting components too finely or placing state ownership in the wrong component makes data flow harder to follow.

Passing TypeScript checks does not guarantee correct external JSON, user input, or business rules. `any` and type assertions can bypass checking, and structural typing allows differently named types to be compatible when required properties match. Therefore API boundaries still need runtime schemas and behavior tests.

Figure 1-4. From JavaScript to TypeScript and React: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

React organizes the UI into components and state, and TypeScript checks the shape of values at those boundaries before execution.

How it works

The type checker compares the structure of component props and function calls and reports mismatches before execution.

Verification evidence

Change fields in the external JSON and compare what type checks, runtime validation, and UI tests each catch.

Follow it through a concrete system

If a product-card component requires `price: number` but the API adapter passes a string, TypeScript can reveal the contract mismatch before the build. However, if the server actually returns a string meaning free and the developer forces a type assertion on the response, the check passes. Static types only check connections between already-known contracts; they do not observe facts outside the network boundary.

In practice, validate external input against a runtime schema, convert values that pass into domain types, and then pass them to components. Component tests check how the loading, empty, error, and normal states appear. Separating these three layers finds type errors, bad external data, and UI behavior errors in different places with shorter feedback loops.

Selection criteria and failure boundaries

Type design and build time add cost, and incorrect types can create a false sense of safety.

Misconceptions to avoid: The claim that TypeScript eliminates the ambiguity of the JavaScript runtime or proves correct behavior is wrong.

Verify it yourself

Change fields in the external JSON and compare what type checks, runtime validation, and UI tests each catch.

What to judgeThe type checker compares the structure of component props and function calls and reports mismatches before execution.

To summarize this chapter

React organizes the UI into components and state, and TypeScript checks the shape of values at those boundaries before execution.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Microsoft, 「TypeScript HandbookReview date 2026-08-28 · Scope Latest official documentation
  2. Microsoft, 「Type CompatibilityReview date 2026-08-28 · Scope Latest official documentation
  3. Meta, 「Your First ComponentReview date 2026-08-28 · Scope Official React learning documentation
  4. Meta, 「State: A Component's MemoryReview date 2026-08-28 · Scope Official React learning documentation

CHAPTER 4 / 8

From React to Next.js: choosing where to render

The key to modern frameworks is not choosing SPA unconditionally but choosing where and when computation happens for each route.

Why this concept became necessary

Client rendering builds the screen after the browser executes JavaScript, making app-like transitions easier, but it can increase the initial bundle and data waterfall. Server rendering produces HTML at request time, providing initial content and shareable URLs, but requires managing server computation and hydration boundaries.

Static generation precomputes pages that can be created at build time for fast delivery. In contrast, per-user data must be fetched at request time or on the client. Even within one site, documents, product lists, and shopping carts have different update cycles and personalization needs, so they need not share one rendering strategy.

Server Components in Next.js can read data on the server and reduce the JavaScript sent to the client, but components that need interaction have client boundaries. This does not mean the backend disappears; part of data access and UI assembly moves into the server component graph.

Figure 1-5. From React to Next.js: choosing where to render: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

The key to modern frameworks is not choosing SPA unconditionally but choosing where and when computation happens for each route.

How it works

Set server/client boundaries for each route and component, and deliver the needed parts through prefetching and streaming.

Verification evidence

Tabulate each route’s personalization, allowed refresh interval, and initial-content requirements, then choose a strategy.

Follow it through a concrete system

A rendering strategy determines when and which bytes to send to the user, not merely a page's name. Public documents can be rendered into HTML at build time and cached on a CDN for a long period. Order history after login requires authorization on each request. For tables with frequently changed filters, it may make sense to fetch some data in the browser after loading the initial structure.

In a hybrid strategy, cache keys and invalidation become the most important operational contract. If user A's response lands in a shared cache, that is a security incident; if a product price is updated but a static page remains, that is a business error. Recording for each route whether it is personalized, how long updates may lag, which functions must work without JavaScript, and what fallback to show on error lets you choose the right boundaries before reaching for framework terminology.

Selection criteria and failure boundaries

Requires understanding cache invalidation, hydration, server/client serialization, and framework rules.

Misconceptions to avoid: SSR, SSG, and Server Components are not mutually exclusive types of sites.

Verify it yourself

Tabulate each route’s personalization, allowed refresh interval, and initial-content requirements, then choose a strategy.

What to judgeSet server/client boundaries for each route and component, and deliver the needed parts through prefetching and streaming.

To summarize this chapter

The key to modern frameworks is not choosing SPA unconditionally but choosing where and when computation happens for each route.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Vercel, 「Server and Client ComponentsReview date 2026-08-28 · Scope Next.js App Router
  2. Vercel, 「Linking and NavigatingReview date 2026-08-28 · Scope Next.js App Router

CHAPTER 5 / 8

The full request path connecting API, DB, and deployment

A single click the user sees is an operational contract that passes through DNS, TLS, the CDN, frontend, API, DB, and observability signals.

Why this concept became necessary

Browser requests reach static resources or an application through an edge cache or reverse proxy. The API must verify the authenticated subject and input, read or modify data inside a transaction, and respond using the specified error format.

Relational databases are not a leftover from an older era; keys, constraints, and transactions make them strong at centrally enforcing rules across related data. Document databases, caches, and search engines complement other access patterns, and PostgreSQL’s JSON support and extensions offer the option of combining some requirements within one operational boundary.

Operational design is not a step added after the code is finished. Define asset hashes, database migrations, health probes, trace IDs, and rollback conditions in advance so you can find where a new version failed and roll it back safely.

Figure 1-6. The full request path connecting API, DB, and deployment: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

A single click the user sees is an operational contract that passes through DNS, TLS, the CDN, frontend, API, DB, and observability signals.

How it works

Explicit contracts and correlation IDs connect processing across layers into evidence for a single request.

Verification evidence

Check whether a single request's status, latency, revision, query, and errors can be linked across layers.

Follow it through a concrete system

When a user clicks the payment button, success of the browser event alone is insufficient. The request must pass through DNS and TLS and be authenticated at the gateway; the API must check the idempotency key; the database transaction must update orders and inventory together; and the same order status must remain queryable even if the response is lost. This is why a 200 response from any one layer cannot establish end-to-end success.

When drawing a request map, record the evidence left at each boundary rather than component names. The browser should retain the result shown to the user, the gateway the request ID and authenticated subject, the API the revision and business errors, the database the transaction result, and the deployment layer the image digest. Only when these identifiers are linked can you narrow an incident to the frontend, cache, or query through evidence rather than guesswork.

Selection criteria and failure boundaries

Each added layer brings more timeout, retry, cache-consistency, and ownership issues.

Misconceptions to avoid: A normal-looking frontend does not mean the entire service is healthy.

Verify it yourself

Check whether a single request's status, latency, revision, query, and errors can be linked across layers.

What to judgeExplicit contracts and correlation IDs connect processing across layers into evidence for a single request.

To summarize this chapter

A single click the user sees is an operational contract that passes through DNS, TLS, the CDN, frontend, API, DB, and observability signals.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Vercel, 「Server and Client ComponentsReview date 2026-08-28 · Scope Next.js App Router
  2. PostgreSQL Global Development Group, 「ConstraintsReview date 2026-08-28 · Scope PostgreSQL 18 / current
  3. OpenTelemetry, 「Context PropagationReview date 2026-08-28 · Scope Latest official documentation

CHAPTER 6 / 8

Search results arriving out of order

Render the state currently requested by the user, not whichever response arrives last.

Why this concept became necessary

Typing A and then B can send requests in that order while responses arrive B then A. Network order does not establish the user’s latest intent, so blindly storing the last response can restore stale results.

Associate each request with its query and sequence, then compare them with current conditions before applying the result. Cancellation reduces waste but does not undo server work already completed, so retain a separate result-application check.

A React event handler sees state from the render that created it. Assuming a state setter immediately changes values read within that handler can misassociate consecutive inputs and asynchronous responses.

Distinguish the text being edited, the requested query, and the query represented by displayed results. Keeping old results or showing loading is a product decision, but results for another query must not be labeled current.

Figure 1-7. Search results arriving out of order: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

Render the state currently requested by the user, not whichever response arrives last.

How it works

Comparing request identity with current view conditions prevents stale responses from being applied.

Verification evidence

Reverse response order and mix successes and failures to check that the latest user conditions remain authoritative.

Follow it through a concrete system

In a teaching fixture, delay A by 800 ms and B by 100 ms to reverse response order. These values are test conditions for reproducing ordering errors, not measured service performance. Use a mock that independently releases each response instead of relying on timer luck. This reproduces the same causal ordering even on slow test machines.

After B appears, release A and verify that both the visible query and result identifiers remain associated with B. A test checking only request counts can miss a stale result overwriting the screen. Check both the first visible item and its link target ID. A B title with an A link is a mismatch between appearance and actual user action.

Add failures to the same fixture and check that error messages also belong to the current request. If A’s late failure replaces B’s successful screen, only the success path has been fixed. Check whether error state carries its request ID. One shared error boolean cannot distinguish a past request’s failure from the current request’s failure.

Record query conditions, applied and discarded response IDs, and visible results. The next reviewer should reproduce the same sequence and confirm failure before the fix and success afterward. Also check that discarded responses are not double-counted as successful visible results. Network responses and results actually viewed are different metrics; combining them changes the interpretation.

Selection criteria and failure boundaries

Cancellation and result validation both need design; do not assume completed server mutations were canceled.

Misconceptions to avoid: A response arriving later is not necessarily newer.

Verify it yourself

Reverse response order and mix successes and failures to check that the latest user conditions remain authoritative.

What to judgeComparing request identity with current view conditions prevents stale responses from being applied.

To summarize this chapter

Render the state currently requested by the user, not whichever response arrives last.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Meta, 「State as a SnapshotReview date 2026-09-14 · Scope Official React learning documentation on state snapshots
  2. Meta, 「State: A Component's MemoryReview date 2026-08-28 · Scope Official React learning documentation
  3. Vercel, 「Linking and NavigatingReview date 2026-08-28 · Scope Next.js App Router

CHAPTER 7 / 8

Verify readable HTML and working interaction separately

Visible content and connected React events are separate completion criteria.

Why this concept became necessary

Server-produced HTML can show headings and content before JavaScript arrives. Save buttons and state transitions still need client code, so a screenshot alone cannot prove interaction works.

Hydration connects client behavior to existing HTML. If server output and the first client render start with different user states, they may disagree, so distinguish the public initial state from when browser-stored personal state is read.

Progress in browser storage can be restored after client initialization without entering public initial content. Clearing the article or replacing the entire screen while restoration is pending can disrupt reading position and assistive navigation.

Initial HTML and the client must reference the same public image assets. A server filesystem location may exist in development yet remain inaccessible to users, so verify both asset existence and the public scope of its URL.

Figure 1-8. Verify readable HTML and working interaction separately: decision flowThe chain from the problem conditions through the working principle to verification evidence.
Problems and selection criteria

Visible content and connected React events are separate completion criteria.

How it works

Verify client initialization and saved-state restoration while preserving the same initial article.

Verification evidence

Check article-node preservation, restored completion, two clicks and persistence changes separately.

Follow it through a concrete system

Test a teaching completion button by seeding saved completion before opening the page. Wait within a bounded interval for the button to restore while the article DOM remains intact, rather than assuming one short fixed delay is sufficient. If the deadline expires, retain initial storage and final button state as failure evidence rather than passing. This distinguishes delay from missing restoration behavior.

After restoration, click to clear completion and then complete it again. Both the accessible button state and stored value must change each time to establish that events and persistence work. If the UI changes without persistence, reload brings the old state back. Verify that the final click actually records the value needed when reopening the page.

A native details disclosure can work without JavaScript, so testing only that may pass even when client code never runs. Keep an actual React-state interaction and readable no-JavaScript content as separate evidence. A fixture blocking JavaScript does not demand a working completion button. It checks readable headings and content links, keeping the two tests’ responsibilities separate.

Separate missing initial HTML, invalid asset paths, failed state restoration and failed persistence after clicking. Distinct reports identify whether SSR generation or a client effect needs repair. After repair, test both first and returning visits. Testing only empty storage can keep mismatches in personal-state restoration hidden.

Selection criteria and failure boundaries

The transition from initial rendering to personal-state restoration needs explicit design and interaction tests.

Misconceptions to avoid: Visible content or a working details disclosure does not prove successful hydration.

Verify it yourself

Check article-node preservation, restored completion, two clicks and persistence changes separately.

What to judgeVerify client initialization and saved-state restoration while preserving the same initial article.

To summarize this chapter

Visible content and connected React events are separate completion criteria.

Official sources for this chapter

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Vercel, 「Server and Client ComponentsReview date 2026-08-28 · Scope Next.js App Router
  2. Meta, 「State: A Component's MemoryReview date 2026-08-28 · Scope Official React learning documentation
  3. Microsoft, 「Playwright AssertionsReview date 2026-08-28 · Scope Latest official documentation

CHAPTER 8 / 8

Filters and detail views recoverable through URLs

Define a recoverable URL contract for state needed by sharing, reload and back navigation.

Why this concept became necessary

If filters disappear after visiting a detail item from page three and going back, fast client navigation still fails the task. This commonly happens when ownership of search conditions between URL and in-memory state is undefined.

Represent shareable sorting, pagination and public search conditions in the URL, while excluding passwords and private tokens. URLs can enter history and logs, so recoverability does not replace data minimization.

URL values are external input. Validate allowed sorts, page ranges, and defaults, and explicitly normalize invalid values so reloads and client transitions do not run with different conditions.

Changing filters can invalidate the previous page number. Use one rule to reset pagination or clamp it to a valid range, and send the same normalized conditions to the server.

Problems and selection criteria

Define a recoverable URL contract for state needed by sharing, reload and back navigation.

How it works

Parse the URL into validated query conditions shared by the view and server.

Verification evidence

Check identical query interpretation on direct entry, reload, back navigation, and invalid URLs.

Follow it through a concrete system

Open a fictional product list with category=books and page=3, then select an item. Compare whether a copied URL in a new tab and back navigation restore the same filters. The detail link must preserve conditions for returning to the list. Check browser-history navigation as well as any custom back button.

Create fixtures with page=-1 and an unsupported sort value. Decide in advance whether to show an error or fall back to defaults, then check the resulting URL, request conditions, and on-screen display against the agreed rule. Supply the same invalid value through both server entry and client-side filter changes. An error in one path and a silent default in the other can make a shared URL behave differently for different users.

If old results remain visible on a slow connection, indicate which conditions they represent. Showing a new URL alongside old results labeled current can cause users to select the wrong item. Tie loading completion to success for the requested conditions. An unrelated early response must not clear loading and imply that new results are ready.

Completion evidence includes direct entry, reload, back navigation and invalid URL input, not one link click. Consistent interpretation across these paths makes state shareable rather than dependent on temporary memory. Preserve previously shared-link fixtures when changing the URL contract. State design that works only on the new screen can strand bookmark and external-link users.

Selection criteria and failure boundaries

Define disclosure and invalid-value policies; not every state belongs in the URL.

Misconceptions to avoid: A screen change on the client does not mean that sharing a link or reloading will automatically restore that screen.

Verify it yourself

Check identical query interpretation on direct entry, reload, back navigation, and invalid URLs.

What to judgeParse the URL into validated query conditions shared by the view and server.

To summarize this chapter

Define a recoverable URL contract for state needed by sharing, reload and back navigation.

The technical facts in the text were reviewed against the following primary sources. The author reconstructed the diagrams and comparisons using these materials.

  1. Vercel, 「Linking and NavigatingReview date 2026-08-28 · Scope Next.js App Router
  2. Meta, 「State: A Component's MemoryReview date 2026-08-28 · Scope Official React learning documentation
  3. Microsoft, 「Playwright Best PracticesReview date 2026-08-28 · Scope Latest official documentation

INTERACTIVE LAB 1 / 2

Lab 1 · Set rendering boundaries for news and personal dashboards

Public news is updated every 10 minutes, and search traffic matters. A signed-in dashboard shows each user's live account balance, and the balance API must not be cached.

Choose the design that separates the needs of the two routes most precisely.

Choose an answer

Correct answer C

A. Build every screen as a client-only SPA with a single global cache.The implementation is unified, but it misses the initial HTML needed for public news and per-user cache isolation.

B. Server-render every request and cache every response on the CDN for 10 minutes.Personal account balances may enter the shared cache, violating security and freshness requirements.

C. Regenerate the news statically, and use an authenticated server boundary with no-store balance requests for the dashboard.A design that reflects update and personalization conditions for each route and separates cache boundaries.

D. Combining news and balances into one microservice eliminates the rendering problem.The number of services does not solve rendering-location or cache-policy problems.

INTERACTIVE LAB 2 / 2

Lab 2 · Reproduce late responses and saved progress

Search A is followed by search B. B succeeds first, and A fails later. Learning completion for the same screen was saved as true on a previous visit.

Choose a test that verifies both current results and actual interaction.

Choose an answer

Correct answer C

A. Compare only screenshots after both responses finish.Appearance alone does not establish button events or persistence.

B. Clear B because A’s error arrived last.Arrival order does not replace the user’s request order.

C. Keep the B result, restore saved progress, and then check clearing and re-completing with the completion button, along with the stored values.This checks both request identity and the distinct React-state and storage contracts.

D. Pass event wiring when details opens.Native disclosure can work even when React code does not run.

KEY TERMS

Key terms in this unit

From the document web to the dynamic web
The browser requests only the data it needs and updates part of the DOM, reducing full-document round trips.
Why frontend and backend separated
API schemas and versioning policies loosely couple components with different deployment cycles.
From JavaScript to TypeScript and React
The type checker compares the structure of component props and function calls and reports mismatches before execution.
From React to Next.js: choosing where to render
Set server/client boundaries for each route and component, and deliver the needed parts through prefetching and streaming.
The full request path connecting API, DB, and deployment
Explicit contracts and correlation IDs connect processing across layers into evidence for a single request.
Search results arriving out of order
Comparing request identity with current view conditions prevents stale responses from being applied.
Verify readable HTML and working interaction separately
Verify client initialization and saved-state restoration while preserving the same initial article.
Filters and detail views recoverable through URLs
Parse the URL into validated query conditions shared by the view and server.

UNIT WORKBOOK

Exercises and worksheets for applying concepts to new situations

Start by checking basic principles, then expand to practical workplace decisions. After submitting an answer, you can see why every option is correct or incorrect, not just the correct answer.

THREE-LEVEL ASSESSMENT

From basic principles to operational decisions

After you submit an answer, you can see not only the correct answer but also why each option is right or wrong.

Basic Question 1

What does TypeScript's static check directly guarantee?

Choose an answer

Correct answer A

A. A detectable mismatch between the value shapes in the code under test and its call contractFinds inconsistencies before execution, within what static analysis can determine.

B. Accuracy of all business rulesBusiness rules need testing and review.

C. Identical execution results across browsersTypes alone cannot guarantee identical behavior across different runtime environments.

D. That external API responses always have the declared shapeWithout runtime validation, external input can differ from its declared shape.

Apply Question 2

Why should product information and the shopping cart not be forced to use the same rendering strategy?

Product information changes once a day, while the shopping cart changes with each user input.

Choose an answer

Correct answer B

A. Because the server can't process user data.The server processes authenticated user data.

B. Because refresh timing, personalization, and cacheable scope differ.Routes with different requirements may also compute in different places and at different times.

C. Because React can't create product introductions.Whether to use React and which update strategy to choose are separate decisions.

D. Because the shopping cart has no URL.A shopping cart can also have a URL and recovery policy.

Capstone Question 3

What evidence should be recorded first, before deciding to split services?

Choose an answer

Correct answer C

A. Popularity ranking of the programming language to useLanguage popularity is not a basis for service boundaries.

B. Name of the container to deployA name is an implementation detail that follows the structural decision.

C. Features that change together, independent scaling needs, and current failure boundariesFirst identify the actual coupling and operational constraints that separation would address.

D. The number of microservices at a famous companyFigures from organizations of different sizes are not evidence of current constraints.

PRIMARY SOURCES

Course references

This list collects the sources for each chapter. The text and author-created diagrams were prepared by directly reviewing the originals below.

PERSONAL WORKSHEET

A learning worksheet you adapt to your own environment

Your input remains only on the current browser screen and is not stored or transmitted externally. Use categories and pseudonyms instead of actual sensitive information.

OFFICIAL SOURCES

Verify against official sources

Technical, compatibility, and model information reviewed: August 2026

LEARNING RECORD

Have you reviewed the text, decision activities, and all explanations?

Completion status is stored only in this browser.